【问题标题】:How android system autoconnects to paired device?android系统如何自动连接到配对设备?
【发布时间】:2016-08-23 06:26:51
【问题描述】:

我想知道的:

我想知道安卓系统(如安卓智能手机)如何自动连接之前配对的设备。

例如,我在第一天通过"turn on scanning/advertising -> click pairing" 的程序将我的蓝牙耳机与我的安卓智能手机配对。当我在耳机上打开广告时,它会在第二天自动连接, 3、4 等等。关键是,我无需再次扫描智能手机即可找到我的(配对)耳机。

我不明白 android 系统如何发现配对的设备已打开。 android系统会在后台定期扫描吗?即使我不点击“扫描”按钮?

我为什么要问:

我想让我的应用在配对后自动连接到定制的 BLE 设备。我成功地使用createBond() 方法进行配对(绑定),但在那之后,我找不到如何进行自动连接。我知道我可以像这样打开自动连接功能connectGatt(XXX, true, XXX),但是当BLE设备断开几天后,这个自动连接功能就不起作用了。

所以我想让我的应用像安卓系统和蓝牙耳机一样工作。但是即使我挖掘AOSP代码,我也找不到android蓝牙系统的工作原理。

我发现了很多关于我的问题的问题(herehere),但没有答案。

提前致谢。

更新:

我发现bt_btif 在配对的耳机打开(开始广告)时被激活(使用 LG 智能手机和 Nexus 5)。但是bt_btif 没有被我的自定义 BLE 设备激活...我该怎么办?

【问题讨论】:

  • 以您的耳机为例是没有用的:经典蓝牙与 BLE 的扫描工作方式完全不同。

标签: android bluetooth bluetooth-lowenergy


【解决方案1】:

我做过一个类似的应用程序,我对此没有任何问题。作为解决问题的最后手段,我建议将 BLE 设备地址写入一个简单的 DB 表并手动连接到它。我做了这样的东西here .这不是最佳实践代码,但我希望您能找到适合您解决方案的想法。

【讨论】:

  • 我想做的是自动重新连接到 BLE 设备,无需用户输入任何内容。我认为您的应用程序通过单击设备连接到设备。如果我的理解有误,请告诉我。
  • 纠正初始化,但你可以在其他事件上做类似的事情,例如当应用程序启动时,或者当发现新设备时,检查它的地址是否已经在数据库中。
  • 我找到了一个基于您的代码启发的想法的解决方案。谢谢!
【解决方案2】:

我想我找到了解决办法。

首先,我的问题的解决方案:Android智能手机似乎从硬件方面检测附近蓝牙设备的状态变化。当配对的蓝牙耳机开始做广告时,会调用 HAL(我认为)中的回调。

因此,当活动开始时(在MainActivity 中的onResume() 中),我使用MAC 地址将我的应用程序添加到connectGattautoConnection=True 到我想要的设备。

如果我的 BLE 外围设备不做广告,连接将会失败。但是设备在开始广播时会自动连接,因为 autoConnection 参数设置为 true。

【讨论】:

    【解决方案3】:

    执行connectGatt(XXX, true, XXX) 是正确的方法。 gatt.connect() 也会启动自动连接。执行此操作后,您的手机将扫描该设备,一旦出现,它就会连接到该设备。唯一会中断此调用的是手机上的蓝牙是否已关闭,或者您的应用程序进程是否被终止。为避免您的进程被杀死,请让您的应用拥有前台服务。

    然而,有个问题,Android 中存在一个错误,它有时会使自动连接改为直接连接(并在 30 秒左右后取消)。见https://code.google.com/p/android/issues/detail?id=69834。您需要使用反射来避免此错误。

    【讨论】:

    • 感谢您对自动连接错误的评论!它让我走上了一条我从未调查过的调试路线。这个答案中有一个完整的java解决方法:stackoverflow.com/a/39269766/5414907
    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多