android - una - porque no puedo vincular mi bluetooth
Conectarse programáticamente a un dispositivo Bluetooth emparejado (4)
De acuerdo, ya que esto me estaba volviendo loco, investigué un poco el código fuente y encontré una solución 100% confiable (al menos en mi Nexus 4, Android 4.3) para conectar a un dispositivo A2DP emparejado (como un auricular o dispositivo de audio Bluetooth). He publicado un proyecto de muestra completamente funcional (construido fácilmente con Android Studio) que puedes encontrar aquí en Github .
Esencialmente, lo que necesitas hacer es:
- Obtener una instancia del
BluetoothAdapter
- Usando esta instancia, obtenga un proxy de perfil para A2DP:
adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);
donde el listener
es un ServiceListener
que recibirá un onServiceConnected()
BluetoothProfile
en su devolución de llamada onServiceConnected()
(que se puede convertir en una instancia de BluetoothA2dp
)
- Utilice la reflexión para adquirir el método
connect(BluetoothDevice)
en el proxy:
Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
- Encuentra tu
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;
}
}
}
- E invoca el método
connect()
:
connect.invoke(proxy, result);
Lo cual, al menos para mí, provocó una conexión inmediata del dispositivo.
¿Hay alguna forma, utilizando el SDK de Android, para conectarse mediante programación a un dispositivo Bluetooth ya emparejado?
En otras palabras: puedo acceder a Configuración -> Conexiones inalámbricas y redes -> Configuración de Bluetooth, y tocar el dispositivo (que aparece como "Conectado pero no conectado"), momento en el que se conectará. Me gustaría poder hacer esto mediante programación, pero no veo una manera de hacerlo.
Veo las opciones para crear un zócalo RFCOMM, y para un dispositivo SPP, asumo que también hará la parte de conexión, pero para un dispositivo A2DP, donde la transferencia de datos real será manejada por el sistema operativo en lugar de por Mi aplicación, creo que eso no es aplicable?
La mejor manera que encontré para resolver mi problema fue descubrir que puedo crear un botón que muestre la pantalla de configuración de Bluetooth. No me di cuenta de que podías hacer esto, o lo habría hecho desde el principio.
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
Si el dispositivo ya está emparejado, entonces puede usar
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();
}
}
para el uso de MY_UUID
private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
el fragmento de código anterior es solo para conectar su dispositivo a un dispositivo compatible con A2DP. Espero que funcione.
Utilicé el código aquí como punto de partida para esta funcionalidad en mi aplicación: http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices
Una vez que el dispositivo está emparejado, la aplicación no tiene problemas para conectar los dos dispositivos de manera programática.