Android蓝牙IOException:连接被拒绝

好吧,这是交易.我买了两部兼容蓝牙的galaxy Nexus手机.

我编写了一个蓝牙连接管理应用程序,用于设备发现和连接.它还输出设备可以支持的所有可用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然后使用反射方法.

我没有遇到这三种方法中的一种没有奏效的情况.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...