我试图与另一个发声器建立蓝牙连接。稍后,它将是一个带有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;
}
由于'原始黑客'没有工作,我还没有找到任何其他解决方案,我希望这里有人知道如何解决这个问题。
祝你好运!
答案 0 :(得分:0)
这是我和其他公司在使用Android手机的蓝牙设备时遇到的问题。这里有很好的描述:Service Discovery Failed Exception Using Bluetooth On Android
您描述为被删除的方法实际上仍然可以运行。这是我们成功使用的那个。我们尝试使用
进行连接tmp = device.CreateRfcommSocketToServiceRecord(MY_UUID);
您在上面显示的方法。 在tmp.Connect()周围使用try ... catch块(您的代码不显示Connect调用) 在catch块"重新创建"使用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,它适用于所有情况。