2011-10-25 81 views
2

--------已解决-------------- 我正在写一个android使用RFCOMM通过蓝牙连接到设备的应用程序。我使用BluetoothChat示例作为建立连接的基础,并且大部分时间一切正常。有时由于套接字已打开的消息,我无法重新连接:RFCOMM_CreateConnection - 已打开状态:2,RFC状态:4,MCB状态:5 如果我连接到设备,关闭应用程序(调用onDestroy ()),重新打开它并尝试再次连接,结果如上所示。RFCOMM_CreateConnection - 已打开状态:2,RFC状态:4,MCB状态:5

我用这个方法在ConnectThread连接(例如ref.BluetoothChat): 方法M = device.getClass()getMethod( “createRfcommSocket”,新的等级[] {int.class}); tmp =(BluetoothSocket)m.invoke(device,Integer.valueOf(1));
mmSocket = tmp;

解决此问题的唯一方法是关闭/打开android手机的蓝牙。这导致我相信socket没有在onDestroy()上关闭,但我仍然要求关闭所有线程,如前面提到的示例中所示。 任何想法将appriciated。

+0

我解决了这个在我的主要活动,其中的onResume检查连接状态,并相应restards蓝牙连接做了检查。 –

+0

嘿,这可能是一个5岁的问题超级随机,但你会记得你观察这个设备上的什么设备?我在谷歌工作,我试图追捕这个根源。 –

+0

@ZachJohnson因为我在2016年遇到了这个问题,并试图为我的一位业务合作伙伴解决这个问题。 设备是HTC Flyer P510e。我希望这会有所帮助。 – Lvka

回答

3

我在这一个迷迷糊糊过了,这里是我找到了答案:

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

解决方案

从API级别14开始存在的BluetoothSocket一个方法叫isConected(),返回true,如果此套接字已连接,否则为假,这里从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