Je comprends comment obtenir une liste des appareils couplés, mais comment puis-je savoir s'ils sont connectés?
Cela doit être possible car je les vois dans la liste des appareils Bluetooth de mon téléphone et cela indique leur statut de connexion.
Je comprends comment obtenir une liste des appareils couplés, mais comment puis-je savoir s'ils sont connectés?
Cela doit être possible car je les vois dans la liste des appareils Bluetooth de mon téléphone et cela indique leur statut de connexion.
Réponses:
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);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
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)) {
... //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:
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" />
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...
}
};
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);
}
}
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?
val m: Method = device.javaClass.getMethod("isConnected")
et val 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
BluetoothAdapter.getDefaultAdapter().isEnabled
-> renvoie true lorsque le bluetooth est ouvert
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> renvoie true lorsque l'appareil est connecté
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
}