java.io.IOException:读取失败,socket可能关闭或超时,在Android 5.0.1 Lollipop版本上读取ret:-1

Kus*_*hal 6 android bluetooth bluetooth-socket android-5.0-lollipop

我正在与蓝牙设备进行蓝牙套接字连接,并希望从设备读取字节.

我已正确建立连接:

 try {
         Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
          temp = (BluetoothSocket) m.invoke(mmDevice, 1);
 } catch (Exception e) {
 }
Run Code Online (Sandbox Code Playgroud)

我正在从蓝牙设备正确读取字节.

我得到了例外:

java.io.IOException:读取失败,socket可能关闭或超时,读取ret:-1

因此,连接断开,我的设备和蓝牙设备之间的通信也结束了.

这个问题特别在Android 5.0.1 Lollipop上出现

任何人都有解决方法吗?

mad*_*313 6

createRfcommSocketToServiceRecord而不是 createRfcommSocket

createRfcommSocketToServiceRecord获取您传递的UUID并使用SDP来决定用于连接的无线电信道.它还会检查以确保服务器正在使用相同的UUID侦听远程端点.通过这种方式,它是获得连接的最可靠方式:它将始终使用正确的通道,如果打开连接成功,您知道另一端的某些东西可以理解您的协议.

相反,createRfcommSocket只需连接到您告诉它的频道即可.无法知道是否有任何东西在远程端点上侦听:您只知道设备在那里.此外,您选择的无线电频道可能完全不合适.这就是为什么这个函数没有在API中发布,而另一个函数是首选的.

createRfcommSocket最初可能看起来更可靠,但这是因为它没有检查另一个端点是否存在监听器:它忽略了一些错误情况.这对于实验来说可能没问题,但它对生产系统没用,因为用户通常忘记在另一个端点上启动服务器,并且您的应用程序将以混乱的方式失​​败.

当然,由于createRfcommSocket未在API中发布,因此您无法保证它将在未来的Android版本中继续发挥作用.