Как исправить ошибку Android «Фоновое выполнение не разрешено: получение намерения {...}» - PullRequest
0 голосов
/ 08 апреля 2019

Итак, я программирую приложение для Android, которое использует обнаружение Bluetooth устройств.Вот код, который я использую для запуска обнаружения.

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

Может кто-нибудь сказать мне, что означает эта ошибка, а также как ее исправить?

Iтакже найдите другие вопросы о переполнении стека с ошибками, которые выглядят очень похожими;например, вместо Bluetooth это будет в контексте BOOT_COMPLETED, ACTION_POWER_DISCONECTED или BATTERY_LOW.Как те похожи на это.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

В моем случае - 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);
0 голосов
/ 08 апреля 2019

Я думаю, что это из-за запрета неявного вещания Android O, чтобы решить эту проблему, вы можете сделать так, чтобы ваша targetSDKVersion была меньше 26.Вы можете найти больше здесь https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html

...