我想知道的事情:
我想知道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蓝牙系统的工作原理。
我发现很多问题(here和here)关于像我这样的问题,但没有答案。
提前致谢。
更新
我发现当配对的耳机开启时,bt_btif
会被激活(使用LG智能手机和Nexus 5)(开始投放广告)。但bt_btif
并未通过我的自定义BLE设备激活......我该怎么办?
答案 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 。这不是最佳实践代码,但我希望您能找到适合您的解决方案。