我编写了一个蓝牙连接管理应用程序,用于设备发现和连接.它还输出设备可以支持的所有可用UUID.
从http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm开始,以下标准UUID从Galaxy Nexus设备中暴露出来.
> 0x1116 – NAP
> 0x112f – PBAP(电话簿访问配置文件)
> 0x111f – HFP(免提)
> 0x1105 – OPP(对象推送配置文件)
> 0x1112 – HSP(耳机配置文件)
> 0x110c – AVRCP
> 0x110a – A2DP
我试图通过OPP配置文件(UUID 00001105-0000-1000-8000-00805F9B34FB)连接并在设备之间推送对象(文件).我已经完成了关于如何发现,配对/绑定(线程等)和管理所有蓝牙连接的整个Android API documentation.我已成功通过SPP(0x1101)配置文件成功连接并与传统板设备通信.
但是,当我尝试在两个galaxy nexus手机之间使用socket.connect()时,会出现配对对话框,然后我点击两个设备上的Pair按钮.之后,我立即得到一个Connection Refused IOException.请注意,配对发生后,我再也不会被问到哪个有意义,因为安全链接被缓存了.
如果我无法使用这些标准UUID连接到这些标准配置文件,为什么它们会暴露?如何从我的应用程序连接到任何这些配置文件并与它们进行交互?是因为我的应用程序不是以某种方式受信任的吗?有点奇怪的是,即使Android上的共享功能也根本不起作用.这在Android上完全被破坏了吗?
请不要像我们所说的那样给我提示使用“众所周知的UUID SPP one 0x1101”.这不是我想要的.我对这些东西的运作方式有了很好的理解,我正在寻找一个真正的解决方案或解决问题的方法.
我见过典型的“反射”解决方案,但我不明白为什么这仍然是Android的问题?为什么人们使用反射来使这项工作?我们可以在Android上提交错误来修复此问题吗?
如果这些UUID是标准的,任何应用程序都应该能够连接并与它们交互.为什么这是一个问题,为什么我会得到这个例外?
提前致谢.
UPDATE
因此,由于某些原因,Android系统中的对象推送开始工作.我实际上试图通过我的应用程序连接,但它无法正常工作.然后,我去了联系人应用程序,并试图分享一个神奇地工作的联系人.然后,我回到我的应用程序,现在它的工作……哇.这很奇怪,必须对此作出解释.
解决方法
在我的情况下,我使用三种不同的测试设备(Nexus 5,Galaxy S4,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和Galaxy S4,但它不适用于Note 2.
经过一些测试后,我发现Note 2只能使用’不安全’模式,所以为了迎合这一点,我基本上尝试连接并在必要时循环通过不同的模式.尝试不同的连接模式时,我只是提示“重试连接”.因此,如果连接使用安全失败,那么我将尝试使用Insecure然后使用反射方法.
我没有遇到这三种方法中的一种没有奏效的情况.