Conectar mediante progtwigción al dispositivo Bluetooth emparejado

¿Hay alguna manera, mediante el SDK de Android, de conectarse mediante progtwigción a un dispositivo Bluetooth ya emparejado?

En otras palabras: puedo ir a Configuración -> Conexiones inalámbricas y redes -> Configuración de Bluetooth, y tocar el dispositivo (listado como “Emparejado pero no conectado”), en ese punto se conectará. Me gustaría poder hacer esto programáticamente, pero no veo la manera de hacer esto.

Veo las opciones para crear un socket RFCOMM, y para un dispositivo SPP, supongo 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?

De acuerdo, ya que esto me estaba volviendo loco, investigué el código fuente y encontré una solución 100% confiable (al menos en mi Nexus 4, Android 4.3) para conectarme a un dispositivo A2DP emparejado (como un auricular o dispositivo de audio Bluetooth). He publicado un proyecto de ejemplo completamente funcional (fácil de construir con Android Studio) que puedes encontrar aquí en Github .

Esencialmente, lo que debes hacer es:

  • Obtenga una instancia del BluetoothAdapter
  • Usando esta instancia, obtenga un proxy de perfil para A2DP:

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

donde listener es un ServiceListener que recibirá un BluetoothProfile en su onServiceConnected() (que puede ser lanzado a 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);

  • Encuentre su BluetoothDevice :

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

  • E invoque el método connect() :

connect.invoke(proxy, result);

Lo cual, al menos para mí, provocó una conexión inmediata del dispositivo.

La mejor manera que encontré para resolver mi problema fue descubrir que puedo crear un botón que abre la pantalla Configuración de Bluetooth. No me di cuenta de que podías hacer esto, o lo hubiera hecho desde el principio.

 startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); 

si el dispositivo ya está emparejado, entonces puedes 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 solo sirve 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á sincronizado, la aplicación no tiene problemas para conectar los dos dispositivos de forma programática.