如何修复Android错误“不允许后台执行:接收Intent {...}”

时间:2019-04-08 02:22:26

标签: android bluetooth broadcastreceiver runtime-error android-broadcast

因此,我正在编写一个使用蓝牙发现设备的Android应用程序。这是我用来开始发现的代码。

try {
    myBluetoothAdapter.startDiscovery();
    Log.d("Bluetooth Started successfully","yes");
} catch (Error e) {
    Log.d("FAILED","Ya failed mate");
    e.printStackTrace();
}

然后我注册一个BroadcastReceiver来监视何时找到设备。这是我的代码

IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
final ArrayList<String> stringArrayList = new ArrayList<>();
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,stringArrayList);
final ListView listView = findViewById(R.id.listView);
listView.setAdapter(arrayAdapter);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Log.d("ACTION RECEIVED","Action was received");
    Log.d("Device Name", String.valueOf(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)));
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        stringArrayList.add(device.getName());
        arrayAdapter.notifyDataSetChanged();
        listView.invalidateViews();
    }
    }
};
registerReceiver(myReceiver,intentFilter);

listView,arrayAdapter和stringArrayList只是我要“登录”的东西。

问题是,每当我运行该代码时,都会出现此错误,并且我的代码不起作用。我假设它不起作用的原因是由于此错误。

W/BroadcastQueue: Background execution not allowed: receiving Intent { act=android.bluetooth.adapter.action.DISCOVERY_STARTED flg=0x10 } to com.verizon.messaging.vzmsgs/com.verizon.vzmsgs.receiver.DevicePairingListener

有人可以告诉我此错误的含义以及如何解决吗?

我还在堆栈溢出中发现了其他问题,这些错误看起来非常相似。例如,它将处于BOOT_COMPLETED,ACTION_POWER_DISCONECTED或BATTERY_LOW的上下文中,而不是Bluetooth。那些与此相似吗?

3 个答案:

答案 0 :(得分:1)

Android Oreo及更高版本不再允许

Implicit广播。隐式广播是不专门针对该应用的广播。

不仅使用intent-filter动作名称来构造Intent,还需要在包管理器中搜索提供广播接收器的组件,如下所示:

            Intent intent = new Intent("the intent-filter action name in the different app").setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
            PackageManager packageManager = getPackageManager();
            List<ResolveInfo> infos = packageManager.queryBroadcastReceivers(intent, 0);
            for (ResolveInfo info : infos) {
                ComponentName cn = new ComponentName(info.activityInfo.packageName,
                        info.activityInfo.name);
                intent.setComponent(cn);
                sendBroadcast(intent);
            }

答案 1 :(得分:0)

我认为这是因为Android O的隐式广播禁止,要解决此问题,可以使targetSDKVersion小于26。您可以在https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html

中找到更多信息

答案 2 :(得分:0)

在我的情况下-Android 9(API级别28),我只在代码中定义了BroadcastReceiver才能使其正常工作。

就像这样(在我的情况下,添加到服务中-没关系)

private MyReceiver myReceiver;

@Override
public void onCreate() {
    myReceiver = new MyReceiver();
    this.registerReceiver(myReceiver, new IntentFilter("android.intent.action.myreceiver"));
}


@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

private class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        try {
            if (intent.getAction().equals("android.intent.action.myreceiver")) {
                //logic goes here
            }
        } catch (Exception e) {
            //some log goes here
        }
    }
}

像这样发送广播

Intent intentMy = new Intent();
intentMy.setAction("android.intent.action.myreceiver");
intentMy.putExtra("whatever", true);
sendBroadcast(intentMy);