web-dev-qa-db-fra.com

Comment savoir par programme si un périphérique Bluetooth est connecté?

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.

75
dchappelle

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:

  • Il n’existe aucun moyen 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 des CHANGEMENTS.
  • Pour résoudre le problème ci-dessus, il serait utile de récupérer la liste de tous les périphériques connus/couplés ... puis d'essayer de se connecter à chacun d'eux (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 des périphériques sur le disque afin que votre application puisse les utiliser ultérieurement.
135
Skylar Sutton

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" />

22
jobbert

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...
    }
};
10
pmont

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
1
user5902306

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é

0
ravid rinek