3
votes

Comment corriger l'erreur Android "Exécution en arrière-plan non autorisée: réception de l'intention {...}"

Je programme donc une application Android qui utilise la découverte Bluetooth des appareils. Voici le code que j'utilise pour démarrer la découverte.

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

J'enregistre ensuite un BroadcastReceiver pour surveiller quand des appareils sont trouvés. Voici mon code pour cela

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);

La listView, le arrayAdapter et la stringArrayList ne sont que des choses auxquelles je me «connecte».

Le problème est que chaque fois que j'exécute ce code, j'obtiens cette erreur et mon code ne fonctionne pas. Je suppose que la raison pour laquelle il ne fonctionne pas est à cause de cette erreur.

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

Quelqu'un peut-il me dire ce que signifie cette erreur et comment la corriger?

Je trouve aussi d'autres questions sur Stack Overflow avec des erreurs qui se ressemblent beaucoup; comme, au lieu de Bluetooth, ce sera dans le contexte de BOOT_COMPLETED, ACTION_POWER_DISCONECTED ou BATTERY_LOW. En quoi sont-ils similaires?


1 commentaires

Veuillez publier votre manifeste. Avez-vous un déclaré dans le manifeste avec un contenant android.bluetooth.adapter.action.DISCOVERY_STARTED ?


3 Réponses :


-3
votes

Je pense que c'est à cause de l'interdiction de diffusion implicite d'Android O, pour résoudre ce problème, vous pouvez rendre votre targetSDKVersion inférieure à 26. Pour en savoir plus, cliquez ici https: // commonsware .com / blog / 2017/04/11 / android-o-implicit-broadcast-ban.html


3 commentaires

Selon cela, il n'y a pas moyen de contourner cela. Est-ce vraiment vrai?


C'est ok lorsque vous enregistrez le récepteur dans le code, j'ai téléchargé ce code github.com/googlesamples/android- BluetoothChat , et je peux obtenir un rappel dans le BroadcastReceiver, peut-être que vous pouvez comparer au projet pour trouver où se trouve le problème dans votre projet. J'ai remarqué qu'il y avait deux autorisations déclarées dans le manifeste. android.permission.BLUETOOTH_ADMIN et android.permission.BLUETOOTH, vous pouvez d'abord vérifier cela.


L'utilisation d'une cible inférieure n'est pas une solution.



3
votes

Dans mon cas - Android 9 (niveau API 28), j'ai dû définir mon BroadcastReceiver à l'intérieur du code uniquement pour le faire fonctionner.

Comme ça (ajouté à l'intérieur d'un service dans mon cas - peu importe)

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

Envoyez la diffusion comme ceci

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
        }
    }
}


0 commentaires

1
votes

Les diffusions implicites ne sont plus autorisées dans Android Oreo et versions ultérieures . Une diffusion implicite est une diffusion qui ne cible pas spécifiquement cette application.

Au lieu d'utiliser simplement le nom de l'action de filtre d'intention pour construire l'intention, recherchez dans le gestionnaire de packages le composant fournissant le récepteur de diffusion comme ceci:

< pré> XXX


0 commentaires