Android蓝牙IOException:连接被拒绝

好的,这是交易。 我有两个启用蓝牙的Galaxy Nexus手机。

我写了一个蓝牙连接pipe理应用程序,用于设备发现和连接。 它还输出设备可以支持的所有可用的UUID。

从http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm看 ,以下标准UUID是从Galaxy Nexus设备公开的。

  • 0x1116 – NAP
  • 0x112f – PBAP(电话簿访问configuration文件)
  • 0x111f – HFP(免提)
  • 0x1105 – OPP(对象推送configuration文件)
  • 0x1112 – HSP(耳机configuration文件)
  • 0x110c – AVRCP
  • 0x110a – A2DP

我试图通过OPPconfiguration文件( UUID 00001105-0000-1000-8000-00805F9B34FB )连接并在设备之间推送对象(文件)。 我已经去了整个Android API文档 ,如何发现,配对/绑定(线程等)和pipe理所有的蓝牙连接。 我已经设法通过SPP(0x1101)configuration文件成功连接并与传统主板设备通话。

然而,当我尝试使用两个银河联系电话之间的socket.connect() ,配对对话框显示出来,我点击两个设备上的Pairbutton。 之后,我立即得到一个Connection Refused IOException 。 请注意,配对发生后,我再也不会再问到什么是有道理的,因为安全链接被caching。

如果我无法使用这些标准UUID连接到这些标准configuration文件,为什么它们暴露? 如何从我的应用程序连接到这些configuration文件中的任何一个并与它们交互? 是否因为我的应用程序不是某种可信的? 奇怪的是,即使Android上的Sharefunction也根本不起作用。 这是什么东西在Android上完全破碎?

请避免给我提示使用“众所周知的UUID SPP一个0x1101”像文档说。 这不是我想要的。 我对这个东西是如何工作有一个相当好的理解,我正在寻找一个真正的解决scheme或问题的解释。

我已经看到了典型的“反思”解决scheme,但我不明白为什么这仍然是Android上的问题? 为什么人们使用反思来完成这项工作? 我们可以在Android上提交一个错误来解决这个问题吗?

如果这些UUID是标准的,那么任何应用程序都应该能够连接并与之交互。 为什么这是一个问题,为什么我得到这个exception?

提前致谢。

UPDATE

所以出于某种原因,Android系统中的对象开始工作。 我其实试图通过我的应用程序连接,它不工作。 然后,我去了通讯录应用程序,试图分享一个神奇的联系人。 然后,我回到我的应用程序,现在它工作…哇。 这很奇怪,必须有一个解释。

Solutions Collecting From Web of "Android蓝牙IOException:连接被拒绝"

我遇到了同样的问题,并设法find一个解决scheme,为我工作。

在我的情况下,我使用三种不同的testing设备(Nexus 5,Galaxy S4,Note 2),出于某种原因,Note 2将不会连接到我的蓝牙模块,而其他两个会。

我发现的原因是蓝牙驱动程序有所不同,需要稍微不同的连接方法来创build不同设备之间的连接。

我使用的三种方法被称为“安全”,“不安全”和“反思方法”/“哈克斯”。

  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并不适用。

经过一些testing后,我发现Note 2只能使用“不安全”模式,所以为了迎合这一点,我基本上尝试连接,并在必要时循环使用不同的模式。 当尝试不同的连接模式,我只是提示“重试连接”。 所以,如果连接失败使用安全,那么我将尝试使用不安全,然后使用reflection方法。

我还没有碰到这三种方法之一没有奏效的情况。

你有没有尝试过使用非标准的configuration文件? 即为您的应用程序定制的UUID 。 这也将帮助你知道你(很有可能)只连接到你自己的应用程序,而不是一些其他的应用程序,使用相同的configuration文件注册。

从我的经验来看,蓝牙配对对于第一对尝试来说是非常麻烦的。 但是,使用自定义的UUID有点帮助。

反思方法(我认为)最初是试图用一个特定的设备来修复一个错误,但是我认为有些人在其他地方使用它也是成功的。 该设备被称为Spica或类似的东西。

正如其中一个评论也张贴,我也会尝试失败后再次连接。

基本上写代码,计划失败的第一次尝试,但然后代码尝试在5秒内再次连接,如果出现故障。

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

编辑

根据问题更新和评论:

我同意一些绝对是越野车。 我认为部分问题是BT驱动程序各不相同,每个BT堆栈都有不同的怪癖。 我还发现了一个使用reflection方法和自定义UUID以及其他标准方法的问题。 这似乎对我来说是极端的,但确实覆盖了最大的一面。 不幸的是,作为应用程序开发人员,我们无法控制低级别的栈/代码/驱动程序。

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

我很高兴知道这不只是我。