Ajoutez l'autorisation Bluetooth à votre AndroidManifest,
<uses-permission android:name="android.permission.BLUETOOTH" />
Ensuite , utilisez les filtres intention d'écouter la ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
et les ACTION_ACL_DISCONNECTED
émissions:
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);
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
...
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
...
}
}
};
Quelques notes:
- Il n'y a aucun moyen de récupérer une liste des appareils connectés au démarrage de l'application. L'API Bluetooth ne vous permet pas de QUERY, mais vous permet d'écouter les CHANGEMENTS.
- Une solution difficile au problème ci-dessus serait de récupérer la liste de tous les appareils connus / appariés ... puis d'essayer de vous connecter à chacun (pour déterminer si vous êtes connecté).
- Vous pouvez également demander à un service d'arrière-plan de surveiller l'API Bluetooth et d'écrire les états de l'appareil sur le disque pour que votre application les utilise ultérieurement.
Dans mon cas d'utilisation, je voulais uniquement voir si un casque Bluetooth est 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:
<uses-permission android:name="android.permission.BLUETOOTH" />
la source
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é pour sa réponse, donc je ne recherche aucun point. Juste 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. J'utilise ceci dans un service qui met à jour un drapeau connecté Bluetooth que d'autres parties de l'application font référence.
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(BTReceiver, filter); } //The BroadcastReceiver that listens for bluetooth broadcasts private final BroadcastReceiver BTReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String 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... } };
la source
Il existe une fonction isConnected dans l'API système BluetoothDevice dans https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Si vous voulez savoir si un appareil limité (couplé) est actuellement connecté ou non, la fonction suivante fonctionne bien pour moi:
public static boolean isConnected(BluetoothDevice device) { try { Method m = device.getClass().getMethod("isConnected", (Class[]) null); boolean connected = (boolean) m.invoke(device, (Object[]) null); return connected; } catch (Exception e) { throw new IllegalStateException(e); } }
la source
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?val m: Method = device.javaClass.getMethod("isConnected")
etval connected = m.invoke(device)
.fun isConnected(device: BluetoothDevice): Boolean { return try { val m: Method = device.javaClass.getMethod( "isConnected" ) m.invoke(device) as Boolean } catch (e: Exception) { throw IllegalStateException(e) } }
Ce code est pour les profils de casque, il fonctionnera probablement aussi pour d'autres profils. Vous devez d'abord fournir un écouteur de profil (code Kotlin):
private val mProfileListener = object : BluetoothProfile.ServiceListener { override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) { if (profile == BluetoothProfile.HEADSET) mBluetoothHeadset = proxy as BluetoothHeadset } override fun onServiceDisconnected(profile: Int) { if (profile == BluetoothProfile.HEADSET) { mBluetoothHeadset = null } } }
Ensuite, lors de la vérification du Bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET) if (!mBluetoothAdapter.isEnabled) { return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) }
L'appel de onSeviceConnected prend un peu de temps. Après cela, vous pouvez obtenir la liste des écouteurs connectés à partir de:
mBluetoothHeadset!!.connectedDevices
la source
BluetoothAdapter.getDefaultAdapter().isEnabled
-> renvoie true lorsque le bluetooth est ouvertval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> renvoie true lorsque l'appareil est connectéla source
Je cherchais vraiment un moyen de récupérer l'état de connexion d'un appareil, et non d'écouter les événements de connexion. Voici ce qui a fonctionné pour moi:
BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); List<BluetoothDevice> devices = bm.getConnectedDevices(BluetoothGatt.GATT); int status = -1; for (BluetoothDevice device : devices) { status = bm.getConnectionState(device, BLuetoothGatt.GATT); // compare status to: // BluetoothProfile.STATE_CONNECTED // BluetoothProfile.STATE_CONNECTING // BluetoothProfile.STATE_DISCONNECTED // BluetoothProfile.STATE_DISCONNECTING }
la source