android - java.io.IOException : read failed, 套接字可能关闭或超时,读取 ret : -1 on Android 5. 0.1 Lollipop 版本

标签 android bluetooth android-5.0-lollipop bluetooth-socket

我正在与蓝牙设备建立蓝牙套接字连接,并想从设备读取字节。

我已正确建立连接:

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

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

我遇到异常:

java.io.IOException: read failed, socket might closed or timeout, read ret: -1

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

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

任何人都可以解决吗?

最佳答案

使用 createRfcommSocketToServiceRecord 而不是 createRfcommSocket

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

相比之下,createRfcommSocket 只是连接到您告诉它的 channel 。无法知道远程端点上是否正在监听任何内容:您只知道设备在那里。此外,您选择的广播 channel 可能完全不合适。这就是为什么这个函数没有在 API 中发布,而首选另一个函数。

createRfcommSocket 乍一看似乎更可靠,但这是因为它没有检查另一个端点是否存在监听器:它忽略了一些错误情况。这对于实验来说可能没问题,但对于生产系统没有用,因为用户通常会忘记在另一个端点上启动服务器,您的应用程序将以令人困惑的方式失败。

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

关于android - java.io.IOException : read failed, 套接字可能关闭或超时,读取 ret : -1 on Android 5. 0.1 Lollipop 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29143695/

相关文章:

java - 通过 Scribe 和 Android 使用 LinkedIn 邀请

android - 如何在 Android 上启用/禁用蓝牙硬件初始化日志记录?

android - 在 Android 2.3.x 上使用 SDP 获取具有特定 UUID 的设备

android - 从存储访问框架中的文档 ID 获取文件 URI

android - 在 Android Pre L 设备上使用带有 jack 编译器的 Java 8

Android WebView - onTouchListener 在滚动页面后停止工作

android - 莫纳卡不加载 www/index.html

javascript - Android 键盘 - 在 cordova 应用程序中无法访问

visual-c++ - 获取蓝牙配对设备

android - 工具栏文本变暗