2014-02-13 177 views
19

当应用程序通过A2DP或免提配置文件启动时,我们需要我们的应用程序能够自动连接到配对的蓝牙设备。从Android上的Xamarin连接到配对的蓝牙设备

我们正在为Xamarin(monodroid),Android平台进行工作。

我发现这个计算器的问题:Programmatically connect to paired Bluetooth device

但它涉及到实现这一目标(见kcoppock答案)的原生方式。我想知道是否有办法通过Xamarin来实现这一点。我们可以连接到SPP端点,因为它是一个基于RFCOMM的连接,但我们需要这个连接和音频连接,所以我们想要连接到A2DP。

更新1:

我们已经尝试使用CreateInsecureRfcommSocketToServiceRecord法这样的连接:

mmSocket = device.CreateInsecureRfcommSocketToServiceRecord(0000110A-0000-1000-8000-00805F9B34FB); mmSocket.Connect();

在一个呼叫连接,我们得到了一个错误:

read failed, socket might closed or timeout, read ret: -1

Stack trace begi

Java.IO.IOException at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/buil…

更新2:与NS

顺便说一句,whene我们尝试通过使用the approach by kcoppock本地Java测试应用程序进行连接,连接代码似乎没有一个错误的工作,虽然该设备未作为A2DP耳机连接。

我们看到能够做到的唯一编程方式this Google Play app,这证明这是可能的。

+0

其中一个原因可能是程序的另一部分保持打开连接(提取器)应该读取的同一文件? – SeahawksRdaBest

+0

在连接点上,我们只通过RFComm获得SPP连接,但我们的主要任务是我们的Android设备同时通过SSP和A2DP连接。如果我们通过代码连接到SPP并通过Android设置手动连接到A2DP,则一切正常,所以这证明技术上我们可以同时连接两个配置文件。 –

+0

这可能是一个带宽问题。检查您的特定设备的波特率以及您在音频中的流量。显然,如果你接近极限,rfcomm频道将失败。 – SeahawksRdaBest

回答

-1

有一个本地Java样本程序及其在Xamarin的例子在模拟:http://docs.xamarin.com/samples/BluetoothChat/

+0

我们只用SPP来做到这一点。 SPP连接并正常工作。我们不能做的是通过A2DP连接,但我们需要。 –

+0

请更改您的问题以添加附加限制。我不确定相对于您的要求是什么意思。 – Tim

+0

对不起,蒂姆,我的坏,我应该提到我们只能通过SPP连接,没有其他配置文件。我们确信设备支持,因为我们可以手动连接。 –

1

记住,Xamarin结合本地API,所以不要担心那点事“涉及到本机的方式”;基于对) anwser你引用我写下并测试了下面的代码。我希望它能帮助你。

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) 
    { 
    } 
} 

例如,在OnCreate函数:

btListener btReceiver = new btListener(); 
BluetoothAdapter.DefaultAdapter.GetProfileProxy(this, btReceiver, ProfileType.A2dp); 

只是看着日期..但我无论如何张贴的答案 - 也许它仍然要帮助别人

0

您可以检查此blog post。此链接中的adapter.BondedDevices属性将返回已配对设备的列表。