BluetoothSocket.connect()抛出exception“读取失败”

我有一个通过蓝牙连接到设备的项目。 它曾经相当可靠地工作,但是现在每次都失败了BluetoothSocket.connect()调用。 (好吧,在4个小时的时间里,我经过了数千次的尝试才连接了一次。)大部分代码都来自API中的标准示例聊天代码,除了获取BluetoothSocket设备的常见修改本身:

 Method m = device.getClass().getMethod( "createRfcommSocket", new Class[] { int.class }); tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 

下面是感兴趣的方法,一旦获得了BluetoothSocket就会运行:

 public void run() { setName("ConnectThread" + mSocketType); // Always cancel discovery because it will slow down a connection mAdapter.cancelDiscovery(); // Make a connection to the BluetoothSocket try { mmSocket.connect(); } catch (Exception e) { Log.e(TAG, "Connection to " + mmDevice.getName() + " at " + mmDevice.getAddress() + " failed:" + e.getMessage()); // Close the socket try { mmSocket.close(); } catch (Exception e2) { Log.e(TAG, "unable to close() " + mSocketType + " socket during connection failure", e2); } connectionFailed(e.getMessage()); return; } // Reset the ConnectThread because we're done synchronized (BluetoothChatService.this) { mConnectThread = null; } // Start the connected thread connected(mmSocket, mmDevice, mSocketType); } 

相关日志条目(在调用connect()时捕获exception时打印)是这样的:

11-30 10:23:51.685 E / BluetoothChatService(2870):在00:06:66:42:8E:01连接到ZYNO-700091失败:读取失败,套接字可能closures,读取ret:-1

这个错误曾经出现过一段时间。 我有一个积极的重新连接系统 – 它基本上一遍又一遍地连接到连接,如果它断开连接,它会再次开始锤击。 所以,它杀死连接线程,并不断从头开始。 我曾考虑过可能有一个问题 – 可能是multithreading,或者可能在处理套接字清理/初始化。 但是,如果是这样的话,我仍然期望第一次连接尝试成功,因为该系统在没有尝试连接失败之前不会启动。

我看着抛出exception的源代码 。 这个问题似乎是底层的InputStream没有数据。 当然,这不是一个真正的答案,只是一个步骤。 为什么这个stream没有数据?

我试图对潜在的问题保持开放的态度。 我正确地获得BluetoothSocket ? 事实上,它曾经是一个间歇性的问题,现在几乎是不变的,这让我怀疑是multithreading的,但是与C ++相比,这是一个相对简单的话题 – 如果你知道自己在做什么,很难搞定。 此外,大部分代码(尤其是涉及同步线程的部分)都是直接从示例代码中提取出来的。

另一端的设备是一个embedded式的蓝牙设备,所以没有太多的希望来debugging这个问题。

更新===========================

我想,这可能是由于操作系统升级(我在Galaxy Nexus手机上运行 – 我有几个testing)。 所以我打开一个新的手机与4.0.4,它的工作! 然后回到原来的两个testing手机上testing,这两个手机都运行了4.2,期待着这次我看到的失败。 奇怪的是,现在它也适用于这些手机。 我想说我已经做了一些事情来使这个工作再次,但我没有。 我仍然很迷惑,现在也怀疑这件事情会在我真正需要的时候起作用。

我想知道是否有可能以某种方式连接使用4.0.4可以正确设置服务器模块的状态,使其接受4.2设备? 只是在黑暗中拍摄,我想…

更新2 ===========================

我发现,配对和重新配对将允许设备连接。 这是一个解决方法,但总比没有好。

Solutions Collecting From Web of "BluetoothSocket.connect()抛出exception“读取失败”"

果冻豆有一个完全不同的蓝牙堆栈,所以版本差异肯定会引发一些事情,但这本身并不能解释为什么它保持工作或不工作后,与旧设备连接。 难道是配对吗? 如果再次发生,请尝试从设备取消配对并重新配对。

我知道这是一个古老的问题。 但是,因为我无法在网上find任何解决scheme,下面是我最近创build的解决方法: IOException:读取失败,套接字可能closures – Android 4.3上的蓝牙

我认为这可能工作:首先你必须连接到互联网,并安装一个移动市场的apk,并尝试寻找FXR的WiFi修复和救援,并安装它们并执行,我有类似的问题,我的索尼蓝牙52耳机幸运地是工作目前罚款。