Conectarse a un dispositivo Bluetooth emparejado desde Xamarin en Android
xamarin.android android-bluetooth (3)
Necesitamos nuestra aplicación para poder conectarnos a un dispositivo Bluetooth emparejado automáticamente cuando una aplicación se inicia a través de A2DP o un perfil de manos libres.
Estamos trabajando en Xamarin (monodroid), para la plataforma Android.
He encontrado esta pregunta de stackoverflow: conectarse programáticamente a un dispositivo Bluetooth emparejado
Pero se relaciona con formas nativas de lograr esto (ver respuesta por kcoppock). Me gustaría saber si hay una manera de lograr esto a través de Xamarin. Podemos conectarnos al punto final de SPP ya que es una conexión basada en RFCOMM, pero necesitamos eso y la conexión de audio, por lo que estamos buscando una manera de conectarnos a A2DP.
Actualización 1:
Hemos intentado conectarnos utilizando el método CreateInsecureRfcommSocketToServiceRecord
siguiente manera:
mmSocket = device.CreateInsecureRfcommSocketToServiceRecord(0000110A-0000-1000-8000-00805F9B34FB); mmSocket.Connect();
Tras una llamada a Connect, estamos recibiendo un error:
read failed, socket might closed or timeout, read ret: -1
El seguimiento de la pila comienza con:
Java.IO.IOException at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/buil…
Actualización 2:
Por cierto, cuando intentamos conectarnos a través de la aplicación de prueba nativa de java utilizando el método kcoppock , el código de conexión parece funcionar sin errores, aunque el dispositivo no está conectado como un auricular A2DP.
La única forma de programación que hemos visto para poder hacerlo es esta aplicación Google Play , que demuestra que es posible.
Hay un programa de ejemplo de Java nativo y su análogo en los ejemplos de Xamarin en: http://docs.xamarin.com/samples/BluetoothChat/
Puedes consultar esta entrada de blog . adapter.BondedDevices
propiedad adapter.BondedDevices
en este enlace devolverá una lista de dispositivos emparejados.
Recuerde que Xamarin se une a la API nativa, así que no se preocupe de que algo "se relacione con formas nativas";) Basado en la respuesta a la que hizo referencia, escribí y probé el código a continuación. Espero que te ayude.
class btListener : Java.Lang.Object, IBluetoothProfileServiceListener
{
public void OnServiceConnected([GeneratedEnum] ProfileType profile, IBluetoothProfile proxy)
{
String deviceName = "JABRA WAVE+";
BluetoothDevice result = null;
var devices = BluetoothAdapter.DefaultAdapter.BondedDevices;
if (devices != null)
{
foreach (BluetoothDevice device in devices)
{
if (deviceName == device.Name)
{
result = device;
break;
}
}
}
var connect = Java.Lang.Class.FromType(typeof(BluetoothA2dp)).GetDeclaredMethod("connect", Java.Lang.Class.FromType(typeof(BluetoothDevice)));
connect.Invoke((Java.Lang.Object)proxy, result);
}
public void OnServiceDisconnected([GeneratedEnum] ProfileType profile)
{
}
}
Código siguiente en, por ejemplo, la función OnCreate:
btListener btReceiver = new btListener();
BluetoothAdapter.DefaultAdapter.GetProfileProxy(this, btReceiver, ProfileType.A2dp);
Solo miré la fecha ... pero estoy publicando la respuesta de todos modos, tal vez todavía ayude a alguien