我正在使用两个配对智能手机之间使用蓝牙连接的Android应用程序。蓝牙逻辑基于着名的BluetoothChat SDK示例:管理服务器accept()
的线程的“服务”类,客户端connect()
的线程和用于读取/写入套接字的线程。
一切正常,除非我关闭活动连接(来自客户端或服务器端),然后所有连续尝试启动新连接都将失败,并显示以下错误:
java.io.IOException: Service discovery failed
经过一些研究,我认为这是UUID的一个问题。我正在使用BTChat示例的UUID(fa87c0d0-afac-11de-8a39-0800200c9a66
),但问题仍然存在于另一个随机UUID(它是31ef5990-dc20-11e2-a28f-0800200c9a66
)。
这是相关的客户端logcat。 (客户端connect()
失败了):
E/BluetoothService.cpp: stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothService: Cleaning up failed UUID channel lookup: 30:17:C8:A7:C6:C3 fa87c0d0-afac-11de-8a39-0800200c9a66
java.io.IOException: Service discovery failed
D-Bus错误可能是由Android文档建议在cancelDiscovery()
之前调用的connect()
引起的。我认为failed UUID channel lookup
是真正的问题,但我不知道如何解决这个问题。我应该使用另一个(众所周知的?)UUID吗?
如果需要,我可以显示代码段。然而,这个问题在逻辑上与蓝牙相似。
答案 0 :(得分:4)
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
&安培;
m = mAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class });
tmp = (BluetoothServerSocket) m.invoke(mAdapter, BLUETOOTH_CHANNEL);
嗯....我不是BT专家,但我知道我的代码在没有UUID的情况下使用反射。我不认为这是一个很好的解决方案,如果你想要一些干净的东西,但我只知道,在我的情况下,它有效(在2.3.6):)