web-dev-qa-db-fra.com

Connexion par programme à un périphérique Bluetooth couplé

Existe-t-il un moyen, à l'aide du SDK Android, de se connecter par programme à un périphérique Bluetooth déjà couplé?

En d’autres termes: je peux accéder à Paramètres -> Sans fil et réseaux -> Paramètres Bluetooth, puis appuyer sur le périphérique (répertorié comme "Jumelé mais non connecté"), à quel point il se connectera. J'aimerais pouvoir le faire par programme, mais je ne vois pas comment le faire.

Je vois les options pour créer une prise RFCOMM, et pour un périphérique SPP, je suppose que cela fera également la partie connexion, mais pour un périphérique A2DP, où le transfert de données réel sera géré par le système d'exploitation plutôt que par mon application, je pense que ce n'est pas applicable?

44
rmc47

Ok, puisque cela me rendait dingue, j'ai fouillé dans le code source et j'ai trouvé une solution 100% fiable (au moins sur mon Nexus 4, Android 4.3) pour me connecter à un A2DP couplé. périphérique (tel qu'un casque ou un périphérique audio Bluetooth). J'ai publié un exemple de projet pleinement fonctionnel (facilement construit avec Android Studio) que vous pouvez trouver ici sur Github .

Ce que vous devez faire est essentiellement:

  • Obtenir une instance de la BluetoothAdapter
  • En utilisant cette instance, obtenez un proxy de profil pour A2DP:

adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);

listener est un ServiceListener qui recevra un BluetoothProfile dans son rappel onServiceConnected() (pouvant être transtypé en une instance BluetoothA2dp])

  • Utilisez la réflexion pour acquérir la méthode connect(BluetoothDevice) sur le proxy:

Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);

  • Trouvez votre BluetoothDevice:

String deviceName = "My_Device_Name";

BluetoothDevice result = null;

Set<BluetoothDevice> devices = adapter.getBondedDevices();
if (devices != null) {
    for (BluetoothDevice device : devices) {
        if (deviceName.equals(device.getName())) {
            result = device;
            break;
        }
    }
}

  • Et invoquez la méthode connect():

connect.invoke(proxy, result);

Ce qui, du moins pour moi, a provoqué une connexion immédiate de l'appareil.

44
kcoppock

le meilleur moyen que j'ai trouvé pour résoudre mon problème était de savoir que je pouvais créer un bouton qui faisait apparaître l'écran des paramètres Bluetooth. Je n'avais pas réalisé que tu pouvais faire ça, ou je le ferais depuis le début. 

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
6
Belboz

si l'appareil est déjà jumelé, vous pouvez utiliser 

if(device.getBondState()==device.BOND_BONDED){

        Log.d(TAG,device.getName());
        //BluetoothSocket mSocket=null;
        try {


            mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            Log.d(TAG,"socket not created");
            e1.printStackTrace();
        }
        try{

            mSocket.connect();

        }
        catch(IOException e){
            try {

                mSocket.close();
                Log.d(TAG,"Cannot connect");
            } catch (IOException e1) {
                Log.d(TAG,"Socket not closed");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }


        }

pour l'utilisation de MY_UUID

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

l'extrait de code ci-dessus sert uniquement à connecter votre appareil à un appareil compatible A2DP . J'espère que cela fonctionnera.

3
nam_ph

J'ai utilisé le code ici comme point de départ pour cette fonctionnalité dans mon application: http://developer.Android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

Une fois que l'appareil est apparié, l'application n'a aucun problème à connecter les deux appareils ensemble par programmation.

0
Marc Bernstein