88 votes

Procédure de programmation pour dire si un périphérique Bluetooth est connecté? (Android 2.2)

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

Il doit être possible puisque je vois listées dans mon téléphone de la liste des périphériques Bluetooth et il indique l'état de leur connexion.

162voto

skylarsutton Points 1766

L'utilisation des filtres d'intention pour écouter la ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTED, et ACTION_ACL_DISCONNECTED émissions:

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 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 (BluetoothAdapter.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
           ... //Device is about to disconnect
        }
        else if (BluetoothAdapter.ACTION_ACL_DISCONNECTED.equals(action)) {
           ... //Device has disconnected
        }           
    }
};

Quelques remarques:

  • Il n'y a aucun moyen de récupérer la liste des appareils connectés au démarrage de l'application. Le Bluetooth de l'API ne permet pas la REQUÊTE, il vous permet d'écouter des CHANGEMENTS.
  • Un hoaky contourner le problème ci-dessus serait de récupérer la liste de tous les/des appareils reliés... puis essayez de vous connecter à chacun d'eux (pour déterminer si vous êtes connecté).
  • Alternativement, vous pourriez avoir un service d'arrière-plan montre le Bluetooth de l'API et d'écrire les états d'appareil à disque pour votre demande d'utilisation à une date ultérieure.

11voto

pmont Points 506

Un grand merci à Skylarsutton pour sa réponse. Je poste ce comme une réponse à son, mais parce que je suis poster du code, je ne peux pas répondre comme un commentaire. J'ai déjà upvoted sa réponse ne suis pas à la recherche pour tous les points. Juste payer avant.

Pour une raison quelconque BluetoothAdapter.ACTION_ACL_CONNECTED ne peut pas être résolu par Android Studio. Peut-être qu'il était déconseillé dans Android 4.2.2? Voici une modification de son code. Le code d'enregistrement est le même, le récepteur code diffère légèrement. - Je l'utiliser dans un service qui met à jour un Bluetooth connecté drapeau que d'autres parties de l'application de référence.

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

-6voto

dchappelle Points 440

Avec Boost2525 l'aide de la solution à ce problème consistait à consistait à récupérer la liste des appareils appariés et essayez de vous connecter à chacun dans un thread séparé. Le problème d'essayer de se connecter à chaque un seul a répondu ici: Android Bluetooth: Service de l'Échec de la Découverte d'Exception

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X