web-dev-qa-db-ja.com

Androidエラー「バックグラウンド実行は許可されていません:インテント{...}を受信して​​います」を修正する方法

だから私はデバイスのBluetoothディスカバリーを使用する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

誰かがこのエラーの意味と修正方法を教えてもらえますか?

また、Stack Overflowで、非常によく似たエラーのある他の質問を見つけました。たとえば、Bluetoothの代わりに、BOOT_COMPLETED、ACTION_POWER_DISCONECTED、またはBATTERY_LOWのコンテキストになります。これらはどのようにこれに似ていますか。

2
BlueLite

私の場合-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);
2
Daniel