我正在用RFCOMM编写一个通过蓝牙连接到设备上的android应用程序。我使用BluetoothChat示例作为建立连接的基础,并且在大多数情况下一切都是完美的。
但是,有时由于套接字已经打开的消息,我无法重新连接:
RFCOMM_CreateConnection -已打开状态:2,RFC状态:4,MCB状态:5
如果我连接到设备,关闭应用程序(调用onDestroy()),重新打开它并再次尝试连接,就会发生这种情况,这将导致上面的结果。
我在ConnectThread(ref.BluetoothChat示例)中使用此方法进行连接:
Method m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
mmSocket = tmp;解决这个问题的唯一办法就是关掉Android手机的蓝牙。
这使我相信,套接字在onDestroy()中并没有被关闭,但我仍然要求关闭所有线程,如前面提到的示例所示。
任何想法都将不胜感激。
发布于 2012-07-03 08:20:11
我也偶然发现了这个,我发现的答案是:
如果您多次打开和关闭蓝牙套接字连接,则可能发生此错误。
溶液
从API 14开始,BluetoothSocket中有一个名为isConected()的方法,如果这个套接字已经连接,否则为false,则返回true,这里是API的原始摘录:
获取此套接字的连接状态,即是否有与远程设备的活动连接。
对于< 14的API级别,您可以通过关闭连接后让蓝牙处理线程进入休眠状态来解决此问题-- 1000 ms就足够了,下面是一个示例(btDevice是BluetoothDevice类型的,在下面的代码片段之前已经初始化):
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可以被中断,因此它取决于您的用例--哪个选项更适合您的目的。
来源:路易斯·普拉多
https://stackoverflow.com/questions/7888294
复制相似问题