【问题标题】:Connect to paired bluetooth device from Xamarin on Android从 Android 上的 Xamarin 连接到配对的蓝牙设备
【发布时间】:2014-02-13 17:27:56
【问题描述】:

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

我们正在为 Android 平台开发 Xamarin (monodroid)。

我发现了这个 stackoverflow 问题:Programmatically connect to paired Bluetooth device

但它与实现此目的的本地方式有关(请参阅 kcoppock 的回答)。我想知道是否有办法通过 Xamarin 实现这一目标。我们可以连接到 SPP 端点,因为它是基于 RFCOMM 的连接,但我们需要它和音频连接,因此我们正在寻找一种连接到 A2DP 的方法。

更新 1:

我们尝试使用CreateInsecureRfcommSocketToServiceRecord 方法连接,如下所示:

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

在调用 Connect 时,我们收到一个错误:

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

堆栈跟踪开始于:

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

更新 2:

顺便说一句,当我们尝试使用 the approach by kcoppock 通过本机 java 测试应用程序进行连接时,连接代码似乎可以正常工作,尽管该设备并未作为 A2DP 耳机连接。

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

【问题讨论】:

  • 其中一个原因可能是您的程序的另一部分正在打开连接(提取器)应该读取的同一文件?
  • 在连接点,我认为我们只有通过 RFComm 的 SPP 连接,但我们的主要任务是同时通过 SSP 和 A2DP 连接 Android 设备。如果我们从代码连接到 SPP 并通过 Android 设置手动连接到 A2DP,一切正常,因此这证明从技术上讲我们可以同时连接两个配置文件。
  • 这可能是带宽问题。检查您的特定设备的波特率以及您正在流式传输的音频量。显然,如果您接近极限,则 rfcomm 通道将失败。

标签: android bluetooth xamarin.android xamarin android-bluetooth


【解决方案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);

刚刚看了日期..但无论如何我都会发布答案 - 也许它仍然会帮助某人

【讨论】:

  • 对此感到好奇,看来connect 方法不适合在应用程序中使用,还有其他方法可以解决这个问题吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在 Xamarin 示例中有一个本机 java 示例程序及其类似程序:http://docs.xamarin.com/samples/BluetoothChat/

    【讨论】:

    • 我们只使用 SPP 做到了这一点。 SPP 连接并工作正常。我们不能做的是通过 A2DP 连接,但我们需要它。
    • 请更改您的问题以添加额外的限制。我不确定这相对于您的要求意味着什么。
    • 对不起,蒂姆,我的错,我应该提到我们只能通过 SPP 连接,而没有其他配置文件。我们确信设备支持两者,因为我们可以手动连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多