android - Android中的Xamarin蓝牙连接失败

标签 android xamarin bluetooth xamarin.droid

我正在尝试与另一个电话建立蓝牙连接。稍后,它将成为带有 HC5 模块的板,但为了调试我只使用手机。

问题是,连接失败并抛出 IO 异常: “读取失败,套接字可能关闭或超时,读取ret:-1”

快速谷歌搜索显示很多人都存在这个问题。我能看到它解决的唯一方法是使用 API 中未公开的方法

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);

问题是,createRfcommSocket 已被删除,并且 getMethod 的结果将为 null。

我的代码来自示例:https://github.com/xamarin/monodroid-samples/tree/master/BluetoothChat用于连接的是:

        public ConnectThread(BluetoothDevice device, BluetoothChatService service)
        {
            UUID MY_UUID = UUID.FromString("00001101-0000-1000-8000-00805f9b34fb");
            mmDevice = device;
            _service = service;
            BluetoothSocket tmp = null;

            // Get a BluetoothSocket for a connection with the
            // given BluetoothDevice
            try
            {
                if ((int)Android.OS.Build.VERSION.SdkInt >= 10) // Gingerbread 2.3.3 2.3.4
                    tmp = device.CreateInsecureRfcommSocketToServiceRecord(MY_UUID);
                else
                    tmp = device.CreateRfcommSocketToServiceRecord(MY_UUID);


            }
            catch (Java.IO.IOException e)
            {
                Log.Error(TAG, "create() failed", e);
            }
            mmSocket = tmp;
        }

由于“原始黑客”不起作用,而且我还没有找到任何其他解决方案,我希望这里有人知道如何解决这个问题。

最诚挚的问候!

最佳答案

这是我和公司其他人在使用 Android 手机的蓝牙设备时遇到的问题。这里有很好的描述:Service Discovery Failed Exception Using Bluetooth On Android

您所描述的已被删除的方法实际上仍然有效。这也是我们已经成功使用的一种。我们尝试使用

进行连接
tmp = device.CreateRfcommSocketToServiceRecord(MY_UUID);

上面显示的方法。 在 tmp.Connect() 周围使用 try...catch block (您的代码不显示 Connect 调用) 在 catch block 中,使用 createRfcommSocket 方法“重新创建”BluetoothSocket。我用了一个小方法来做到这一点:

       private BluetoothSocket CreateRfcommSocket(BluetoothDevice bTdevice)
    { // This is an "undocumented" call that is needed to (mostly) avoid a Bluetooth Connection error
      // introduced in Android v4.2 and higher. It is used as a "fallback" connection.
      // Full paths version of code!
      //Java.Lang.Reflect.Method mi = device.Class.GetMethod("createRfcommSocket", new Java.Lang.Class[] { Java.Lang.Integer.Type });
      //_bluetoothSocket = (BluetoothSocket)mi.Invoke(device, 1);

        // Compact version of above
        var mi = bTdevice.Class.GetMethod("createRfcommSocket", Integer.Type);
        return (BluetoothSocket)mi.Invoke(bTdevice, 1);
    }

这是此处指示的方法:Xamarin Forum Post

我已经在 Android 4.4.2 和 Android 8.0 上对此进行了测试,并且它可以在这些系统上运行。公司的另一个人在 Android 上测试了 Java 等效代码:4.2.2、4.4.2、7.0 和 8.0,它在每种情况下都有效。

关于android - Android中的Xamarin蓝牙连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46450850/

相关文章:

java - 在Android中使用Fragment时出现ClassCastException

android - 如何将多个 SHA-256 指纹添加到我的 assetslinks.json 以验证 Android 链接?

c# - 在 Xamarin 项目中使用 Entity.FrameworkCore.Sqlite 时找不到程序集 'System.Memory'

Android 自动启用蓝牙 -> 应用需要重启才能正常使用蓝牙

java - 获取有关黑莓蓝牙远程设备的信息

android - AppBarLayout + TabLayout + CollapsingToolbarLayout + SwipeToRefresh

android - 如何使用asyncTask从资源中加载图片

xamarin.ios - 我如何在 Xamarin 上画圆圈?

c# - Xamarin HTTPClient : Error when accessing specific web service

android - 接受线程上的 IOException