Android蓝牙IOException:连接被拒绝

dnk*_*tso 7 android bluetooth rfcomm

好吧,这是交易.我买了两部兼容蓝牙的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文档.我已成功通过SPP(0x1101)配置文件成功连接并与传统板设备通信.

但是,当我尝试socket.connect()在两个galaxy nexus手机之间使用时,会出现配对对话框,然后我点击Pair两个设备上的按钮.在那之后,我马上得到一个Connection Refused IOException.请注意,配对发生后,我再也不会被问到哪个是有意义的,因为安全链接是缓存的.

如果我无法使用这些标准UUID连接到这些标准配置文件,为什么它们会暴露?如何从我的应用程序连接到任何这些配置文件并与它们进行交互?是因为我的应用程序不是以某种方式受信任的吗?有点奇怪的是,即使是ShareAndroid上的功能也根本不起作用.这在Android上完全被破坏了吗?

请不要像我们所说的那样给我提示使用"众所周知的UUID SPP one 0x1101".这不是我想要的.我对这些东西的运作方式有了很好的理解,我正在寻找一个真正的解决方案或解决问题的方法.

我见过典型的"反射"解决方案,但我不明白为什么这仍然是Android的问题?为什么人们使用反射来使这项工作?我们可以在Android上提交错误来修复此问题吗?

如果这些UUID是标准的,任何应用程序都应该能够连接并与它们进行交互.为什么这是一个问题,为什么我会得到这个例外?

提前致谢.

UPDATE

因此,由于某种原因,Android系统中的对象推送开始工作.我实际上试图通过我的应用程序连接,但它无法正常工作.然后,我去了联系人应用程序,并试图分享一个神奇地工作的联系人.然后,我回到我的应用程序,现在它的工作......哇.这很奇怪,必须有一个解释.

pjc*_*jco 2

您是否尝试过使用非标准配置文件?即专门为您的应用程序定制的UUID。这也将帮助您知道您(很可能)仅连接到您自己的应用程序,而不是连接到使用相同配置文件注册的其他应用程序。

根据我的经验,第一次配对尝试时蓝牙配对非常困难。然而,使用自定义UUID会有所帮助。

反射方法(我认为)最初是尝试修复特定设备的错误,但我认为有些人在其他地方使用它也取得了成功。该设备被称为 Spica 或类似的名称。

正如评论之一所发布的,我也会在失败后尝试再次连接。

基本上编写的代码计划在第一次尝试时失败,但如果失败,代码会在 5 秒内尝试再次连接。

这些都是不完美的解决方案,但 Android 上的蓝牙实现也不完美(恕我直言)。希望有帮助

编辑

根据问题更新和评论:

我同意有些东西肯定是有问题的。我认为问题的一部分是 BT 驱动程序各不相同,每个驱动程序都有不同的 BT 堆栈,具有不同的特性。我还发现了一个同时使用反射方法和自定义方法UUID以及其他标准方法的问题。这对我来说似乎很极端,但它确实涵盖了大部分内容。不幸的是,作为应用程序开发人员,我们无法控制低级堆栈/代码/驱动程序。

我发现我的两个蓝牙共享应用程序的第一次配对总是很棘手

我很高兴知道不仅仅是我。