android系统如何自动连接到配对设备?

时间:2016-04-28 13:02:54

标签: android bluetooth bluetooth-lowenergy

我想知道的事情:

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

例如,我在第1天"turn on scanning/advertising -> click pairing"的程序中将我的蓝牙耳机与我的Android智能手机配对。当我打开耳机上的广告时,它会在当天自动连接2,3,4等等。关键是,我不必让我的智能手机再次扫描以找到我的(配对)耳机。

我无法理解android系统如何发现配对设备已打开。 android系统是否会在后台定期扫描?即使我没有点击"扫描"按钮?

为什么我问:

我想让我的应用程序在进行配对后自动连接到自定义的BLE设备。我成功地使用createBond()方法进行配对(绑定),但在此之后,我无法找到如何进行自动连接。我知道我可以这样开启自动连接功能connectGatt(XXX, true, XXX),但是当BLE设备断开连接几天时,这种自动连接功能不起作用。

所以我想让我的应用程序像Android系统和蓝牙耳机一样工作。但即使我挖掘AOSP代码,我也无法找到Android蓝牙系统的工作原理。

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

提前致谢。

更新

我发现当配对的耳机开启时,bt_btif会被激活(使用LG智能手机和Nexus 5)(开始投放广告)。但bt_btif并未通过我的自定义BLE设备激活......我该怎么办?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我想我找到了解决方案。

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

因此,当活动开始时(connectGatt autoConnection=True},我使用onResume()MainActivity应用到了我想要的设备上,使用MAC地址)。

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

答案 2 :(得分:0)

我已经完成了类似的应用,但我没有遇到任何问题。作为您的问题的最后手段,我建议在一个简单的数据库表中写入BLE设备地址并手动连接到它。我做过这样的事情here 。这不是最佳实践代码,但我希望您能找到适合您的解决方案。