Android蓝牙 – 无法连接

我正在开发一个使用蓝牙连接到设备并发送/接收数据的应用程序。 我正在使用Nexus One手机进行所有测试。

我从来没有能够建立从手机到任何设备的SPP(串行端口)连接。 但是,我已经能够使用相当于PuTTY的Mac从设备(我的笔记本电脑)连接到我的手机(唯一的例外是来自Marketplace的“蓝牙文件传输”应用程序似乎可行,但我不认为使用RFCOM / SPP ……)。

我在LogCat日志中看到这条消息:

ERROR/BluetoothService.cpp(78): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) 

以及这些:

 java.io.IOException: Operation Canceled java.io.IOException: Software caused connection abort 

我尝试使用UUID“00001101-0000-1000-8000-00805F9B34FB”,我也试过使用:

 Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); sock = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 

方法而不是device.createRfcommSocketToServiceRecord(UUID); 同样 – 没有运气。

我正在使用BluetoothChat示例和该代码的变体来完成我的所有测试…

解决方案或建议会很棒…或者甚至是我可以在手机上运行的一些测试代码的更好/更简单的例子,或者我可以在计算机上运行以帮助调试的python脚本或其他东西?

谢谢! 我希望这不是Android操作系统的错误,但如果是,我希望找到一个解决方法。


编辑:我还应该注意,大多数设备在蓝牙设置中显示为“已配对但未连接”。


编辑2:解决方案似乎只是禁用任何蓝牙监听。 有关更多信息,请参阅我的回答帖

事实certificate,解决方案是禁用蓝牙服务的服务器function。 通过仅使用createRfcommSocketToServiceRecord并且从不调用listenUsingRfcommWithServiceRecord (在BluetoothChat示例中这意味着永远不会启动“AcceptThread”)问题得到解决。

尽管这两个调用应该是完全分离的并且彼此没有影响(根据Android文档),但只需注释掉listenUsingRfcommWithServiceRecord解决我所谓的无关问题。

我可以使用未经编辑的蓝牙聊天程序,它将无法与我测试的任何蓝牙设备(笔记本电脑,台式机,耳机等)建立传出连接,但如果我删除那一件事它作为客户端完美无瑕地工作。

无论如何,我希望如果他们遇到同样的问题,这将有助于其他人。 这必须是Android操作系统的错误,或者可能是Nexus One上的固件。

我会忽略stopDiscovery错误 – 在你建立连接之前取消发现是很好的。 根据SDK文档:

由于发现是蓝牙适配器的重量级,因此在尝试使用connect()连接到远程设备之前,应始终调用此方法。 发现不是由Activity管理,而是作为系统服务运行,因此应用程序应始终调用取消发现,即使它没有直接请求发现,只是为了确定。

那就是说,你能否在对代码进行任何修改之前让蓝牙聊天示例正常工作?

您想要的SPP / RFCOMM UUID是:

 static UUID UUID_RFCOMM_GENERIC = new UUID(0x0000110100001000L,0x800000805F9B34FBL); 

或定义另一种方式(两者都完成相同的事情)。

 static final UUID UUID_RFCOMM_GENERIC = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");