好吧,这是交易。我有两部Galaxy Nexus手机都有蓝牙功能。
我编写了一个蓝牙连接管理应用程序,用于设备发现和连接。它还输出设备可以支持的所有可用UUID。
从discovery.htm看,以下标准UUID是从Galaxy设备中公开的。
我试图通过OPP (UUID 00001105-0000-1000-8000-00805F9B34FB)和在设备之间推送对象(文件)进行连接。我已经浏览了整个Android API documentation关于如何发现,配对/绑定(线程等)。并管理所有蓝牙连接。我已经成功地通过SPP (0x1101)配置文件连接了一个遗留板设备并与其进行了交谈。
然而,当我尝试在两个星系连接电话之间使用socket.connect()时,就会出现配对对话框,并在两个设备上单击Pair按钮。在那之后,我立即得到一个Connection Refused IOException。注意,在配对之后,我再也不会被询问了,这是有意义的,因为安全链接是缓存的。
如果我不能使用这些标准UUID连接到这些标准配置文件,为什么会公开它们?我如何从我的应用程序连接到任何这些配置文件,并与他们互动?是因为我的应用程序不可信吗?奇怪的是,就连安卓上的Share功能也不起作用。这是在Android上完全坏掉的东西吗?
请避免给我提示使用“众所周知的0x1101”,如医生所说的。这不是我想要的。我非常了解这些东西是如何工作的,我正在寻找一个真正的解决方案或问题的解释。
我见过典型的“反射”解决方案,但我不明白为什么这仍然是Android上的一个问题?为什么人们要用反射来完成这个任务呢?我们能在Android上注册一个bug来解决这个问题吗?
如果这些UUID是标准的,那么任何应用程序都应该能够与它们连接和交互。为什么这是一个问题,为什么我得到这个例外?
提前谢谢。
更新
因此,出于某种原因,Android系统中的对象推送开始工作。实际上,我试图通过我的应用程序连接,但它没有工作。然后,我去了联系人应用程序,并试图分享一个神奇的联系方式。然后,我回到我的应用程序,现在它是works...wow。这是非常奇怪的,必须有一个解释。
发布于 2014-03-18 05:38:25
我遇到了同样的问题,并设法找到了一个对我有用的解决方案。
在我的例子中,我使用了三种不同的测试设备(Nexus 5、Galaxy、Note 2),出于某种原因,Note 2不会连接到我的蓝牙模块,而其他两个会连接到我的蓝牙模块。
我发现的原因是蓝牙驱动程序不同,在不同设备之间创建连接需要稍微不同的连接方法。
我使用的三种方法称为“安全”、“不安全”和“反射方法”/“hax”。
switch(connType)
{
case Secure:
tmpSocket = device.createRfcommSocketToServiceRecord(_uuid);
break;
case Insecure:
tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid);
break;
case Hax:
Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1));
break;
} 在我的例子中,安全模式对Nexus 5和GalaxyS4都有效,但是对于Note 2却不起作用。
经过一些测试后,我发现Note 2只使用“不安全”模式工作,因此,为了满足这种情况,我基本上尝试了一个连接,并在必要时循环不同的模式。当尝试不同的连接模式时,我只需提示“重新尝试连接”。因此,如果连接使用secure失败,那么我将尝试使用不安全的,然后使用反射方法。
我还没有遇到这三种方法中有一种不起作用的情况。
发布于 2012-09-19 00:12:34
你试过使用非标准配置文件吗?也就是说,一个定制的UUID只适合你的应用程序。这也将帮助你知道你是(很可能)只连接到你自己的应用程序,而不是一些其他的应用程序是通过相同的个人资料注册。
根据我的经验,蓝牙配对对于第一对尝试来说是非常糟糕的。然而,使用自定义UUID在一定程度上有助于这一点。
反射方法(我认为)最初是试图用特定的设备修复bug,但我认为有些人在其他地方也成功地使用了它。这个装置叫做Spica或类似的东西。
由于其中一条评论也张贴,我也会尝试连接后,再次失败。
基本上,编写计划在第一次尝试中失败的代码,但如果出现故障,代码将在5秒内再次连接。
这些都是不完善的解决方案,但Android上的蓝牙实现也不完美(IMHO)。希望这有帮助
编辑
根据问题的最新情况和评论:
我同意有件事肯定是有问题的。问题的一部分,我认为是BT驱动各不相同,每个有一个不同的BT堆栈与不同的怪癖。我还发现了一个同时使用反射方法和自定义UUID以及其他标准方法的问题。这在我看来是极端的,但它确实涵盖了最广泛的领域。不幸的是,作为应用程序开发人员,我们无法控制低级堆栈/代码/驱动程序。
我发现在我的两个蓝牙共享应用程序中,第一次配对总是很棘手的。
我很高兴知道这不仅仅是我。
https://stackoverflow.com/questions/12486695
复制相似问题