3

我正在编写一个使用 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() 中关闭,但我仍然要求关闭所有线程,如前面提到的示例所示。
任何想法,将不胜感激。

4

1 回答 1

4

我也偶然发现了这个,这是我找到的答案:

如果您多次打开和关闭蓝牙套接字连接,则可能会发生此错误。

解决方案

从 API 级别 14 开始,BluetoothSocket 中有一个名为isConected()的方法,如果此套接字已连接,则返回 true,否则返回 false,这里是 API 的原始摘录:

获取此套接字的连接状态,即是否与远程设备有活动连接。

对于 API 级别 < 14,您可以通过在关闭连接后让您的蓝牙处理线程进入睡眠状态来解决此问题 - 1000 毫秒应该足够了,这里是一个示例(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
    }

Ps 您也可以使用 Thread.sleep 而不是 SystemClock.sleep - 但是 SystemCock 的睡眠不能被中断,而 Thread.sleep 可以被中断,因此这取决于您的用例,哪个选项更适合您的目的。

资料来源:Louis A. Prado

于 2012-07-03T08:20:11.703 回答