Question

Je comprends comment obtenir une liste des appareils associés, mais comment puis-je savoir si elles sont connectées?

Il doit être possible que je les vois énumérés dans la liste des périphériques Bluetooth de mon téléphone et il indique leur statut de connexion.

Était-ce utile?

La solution

Ajoutez Bluetooth permission à votre AndroidManifest,

<uses-permission android:name="android.permission.BLUETOOTH" />

Ensuite, utilisez les filtres l'intention d'écouter la ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTED et émissions 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) {
        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'y a aucun moyen de récupérer une liste de périphériques connectés au démarrage de l'application. L'API Bluetooth ne vous permet pas de QUERY, au lieu de cela vous permet d'écouter les modifications.
  • Un travail de hoaky autour du problème ci-dessus serait de récupérer la liste de tous connus / appareils associés ... puis essayez de vous connecter à chacun (si vous êtes connecté à déterminer).
  • Sinon, vous pourriez avoir un service d'arrière-plan montre l'API Bluetooth et écrire le périphérique états sur le disque pour votre application à utiliser à une date ultérieure.

Autres conseils

Dans mon cas d'utilisation, je ne voulais 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 comme une réponse à la sienne, mais parce que je suis le code d'affichage Je ne peux pas répondre comme commentaire. Je l'ai déjà upvoted sa réponse si je ne cherche aucun point. Il suffit de payer avant.

Pour une raison quelconque BluetoothAdapter.ACTION_ACL_CONNECTED ne pouvait pas être résolu par Android Studio. Peut-être qu'il a été dépréciée dans Android 4.2.2? Voici une modification de son code. Le code d'enregistrement est le même; le code de récepteur diffère légèrement. Je l'utiliser dans un service qui met à jour un drapeau Bluetooth connecté 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) {
        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 pour les profils casque, probablement il va travailler pour d'autres profils aussi. D'abord, vous devez fournir le profil d'écoute (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, tout 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 jusqu'à ce que onSeviceConnected est appelé. Après cela, vous pouvez obtenir la liste des périphériques connectés de casque:

mBluetoothHeadset!!.connectedDevices

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

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

audioManager.isBluetoothScoOn -> retours vrai lorsque le dispositif connecté

Je sais que ce fil est un peu vieux, mais je vraiment besoin de savoir si un appareil est connecté à droite au démarrage de mon application, et j'ai trouvé la solution!

//List of Paired Devices
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
// There are paired devices. Get the name and address of each paired device.

    for (BluetoothDevice device : pairedDevices) {
        String deviceName = device.getName();
        String deviceHardwareAddress = device.getAddress(); // MAC address
    }
}
else {
//There are no paired devices.
}

Il est juste ici, en Kotlin ainsi: https: // developer.android.com/guide/topics/connectivity/bluetooth#QueryPairedDevices

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top