Comment déterminer par programme si un périphérique Bluetooth est connecté? (Android 2.2)

Je comprends comment obtenir une liste d’appareils associés, mais comment puis-je savoir s’ils sont connectés?

Cela doit être possible car je les vois dans la liste des périphériques Bluetooth de mon téléphone et indique leur statut de connexion.

Utilisez les filtres d’intention pour écouter les diffusions ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTED et ACTION_ACL_DISCONNECTED:

public void onCreate() { ... IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); this.registerReceiver(mReceiver, filter); } //The BroadcastReceiver that listens for bluetooth broadcasts private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Ssortingng action = intent.getAction(); BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (BluetoothDevice.ACTION_FOUND.equals(action)) { ... //Device found } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { ... //Device is now connected } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { ... //Done searching } else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) { ... //Device is about to disconnect } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { ... //Device has disconnected } } }; 

Quelques notes:

  • Il est impossible de récupérer une liste des périphériques connectés au démarrage de l’application. L’API Bluetooth ne vous permet pas de QUERY, mais vous permet d’écouter CHANGES.
  • Un problème autour du problème ci-dessus serait de récupérer la liste de tous les périphériques connus / appariés … puis d’essayer de se connecter à chacun (pour déterminer si vous êtes connecté).
  • Vous pouvez également avoir un service d’arrière-plan qui surveille l’API Bluetooth et écrire les états du périphérique sur le disque pour que votre application puisse l’utiliser ultérieurement.

Dans mon cas d’utilisation, je voulais seulement savoir si un casque Bluetooth était connecté pour une application VoIP. La solution suivante a fonctionné pour moi:

 public static boolean isBluetoothHeadsetConnected() { BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled() && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED; } 

Bien sûr, vous aurez besoin de l’autorisation Bluetooth:

  

Un grand merci à Skylarsutton pour sa réponse. Je poste ceci en réponse à la sienne, mais comme je poste du code, je ne peux pas répondre en tant que commentaire. J’ai déjà voté sa réponse, donc je ne cherche aucun point. Il suffit de payer en avant.

Pour une raison quelconque, BluetoothAdapter.ACTION_ACL_CONNECTED n’a pas pu être résolu par Android Studio. Peut-être était-il obsolète dans Android 4.2.2? Voici une modification de son code. Le code d’enregistrement est le même. le code du récepteur diffère légèrement. Je l’utilise dans un service qui met à jour un indicateur connecté à Bluetooth que d’autres parties de la référence de l’application.

  public void onCreate() { //... IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED); IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED); this.registerReceiver(mReceiver, filter1); this.registerReceiver(mReceiver, filter2); this.registerReceiver(mReceiver, filter3); } //The BroadcastReceiver that listens for bluetooth broadcasts private final BroadcastReceiver BTReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Ssortingng action = intent.getAction(); if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { //Do something if connected Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show(); } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { //Do something if disconnected Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show(); } //else if... } }; 

BluetoothAdapter.getDefaultAdapter().isEnabled -> renvoie true lorsque le bluetooth est ouvert

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) tant que AudioManager

audioManager.isBluetoothScoOn -> renvoie true lorsque le périphérique est connecté