Je comprends comment obtenir une liste d’appareils jumelés, mais comment puis-je savoir s’ils sont connectés?
Cela doit être possible car je les vois listés dans la liste des périphériques Bluetooth de mon téléphone et cela indique leur statut de connexion.
Ajoutez la permission Bluetooth à votre AndroidManifest,
<uses-permission Android:name="Android.permission.BLUETOOTH" />
Puis utilisez les filtres d’intention pour écouter le ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
, et 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 seulement savoir 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 cherche aucun point. Juste payer en avant.
Pour une raison quelconque, BluetoothAdapter.ACTION_ACL_CONNECTED n’a pas pu être résolu par Android Studio. Il est peut-être 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 est légèrement différent. Je l'utilise dans un service qui met à jour un indicateur connecté à Bluetooth avec 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) {
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...
}
};
Ce code est destiné aux profils de casque, cela 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
}
}
}
Puis en vérifiant bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
Il faut un peu de temps pour appeler onSeviceConnected. Après cela, vous pourrez obtenir la liste des dispositifs de casque connectés auprès de:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> renvoie vrai lorsque le bluetooth est ouvert
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> renvoie vrai lorsque l'appareil est connecté