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?
3 Réponses :
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
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.
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 } } }
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
Veuillez publier votre manifeste. Avez-vous un
déclaré dans le manifeste avec un
contenantandroid.bluetooth.adapter.action.DISCOVERY_STARTED
?