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?
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:
BluetoothAdapter
adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);
où listener
est un ServiceListener
qui recevra un BluetoothProfile
dans son rappel onServiceConnected()
(pouvant être transtypé en une instance BluetoothA2dp
])
connect(BluetoothDevice)
sur le proxy:Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
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;
}
}
}
connect()
:connect.invoke(proxy, result);
Ce qui, du moins pour moi, a provoqué une connexion immédiate de l'appareil.
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));
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.
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.