我正在编写一个 Android 应用程序,它使用 RFCOMM 通过蓝牙连接到设备。我使用 BluetoothChat 示例作为建立连接的基础,并且大多数时候一切都运行良好。
但是,有时我无法重新连接,因为出现套接字已打开的消息:
RFCOMM_CreateConnection - 已打开状态:2,RFC 状态:4,MCB
状态:5
如果我连接到设备,关闭应用程序(调用 onDestroy()),重新打开它并尝试再次连接,就会发生这种情况,从而导致上述结果。
我在 ConnectThread 中使用此方法进行连接(参考BluetoothChat 示例):
Method m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
mmSocket = tmp;
解决此问题的唯一方法是关闭/打开 Android 手机的蓝牙。
这让我相信套接字没有在 onDestroy() 中关闭,但我仍然调用关闭所有线程,如前面提到的示例所示。
任何想法,将不胜感激。
我也偶然发现了这个,这是我找到的答案:
如果多次打开和关闭蓝牙套接字连接,则可能会发生此错误。
Solution
从 API Level 14 开始,BluetoothSocket 中有一个方法,称为已连接(),如果此套接字已连接,则返回 true,否则返回 false,这里是 API 的原始摘录:
获取此socket的连接状态,即是否有
与远程设备的活动连接。
对于 API 级别
try {
//Open the socket to an SPP device (UUID taken from Android API for createRfcommSocketToServiceRecord)
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
//Connect to the socket
btSocket.connect();
//Close the socket
btSocket.close();
//Sleep time of 1000ms after closing the socket
SystemClock.sleep(POST_RESET_DELAY);
} catch (Throwable e) {
// Log error message
}
附注除了 SystemClock.sleep,您还可以使用 Thread.sleep - 但是 SystemCock 的睡眠不能被中断,而 Thread.sleep 可以被中断,所以这取决于您的用例,哪个选项更适合您的目的。
Source: 路易斯·A·普拉多
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)