安卓系统如何自动连接配对的设备?

3

我想知道的是:

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

例如,我在第一天通过"打开扫描/广告 -> 点击配对"的步骤将我的蓝牙耳机与我的安卓智能手机配对。当我在第二天打开耳机的广告时,它会自动连接,第三天、第四天等也是如此。重点是,我不需要再次让我的智能手机进行扫描以找到我的(已配对的)耳机。

我不明白安卓系统如何发现已配对的设备已经打开。安卓系统是否会定期后台扫描?即使我没有点击“扫描”按钮?

我提问的原因:

我希望在进行配对后,我的应用程序可以自动连接到自定义的BLE设备。我成功地使用createBond()方法进行了配对(绑定),但之后,我无法找到如何进行自动连接。我知道可以像这样打开自动连接功能:connectGatt(XXX, true, XXX),但是当BLE设备断开连接几天后,此自动连接功能将无效。

因此,我希望我的应用程序可以像安卓系统和蓝牙耳机一样运行。但即使我挖掘AOSP代码,也找不到安卓蓝牙系统的工作原理。

我发现有很多类似于我的问题(这里这里)的问题,但没有答案。

提前致谢。

更新:

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


1
看你的耳机作为示例是没有用的:对于经典蓝牙和BLE,扫描的工作方式完全不同。 - Dan Hulme
3个回答

2
执行connectGatt(XXX, true, XXX)是正确的方法。 gatt.connect() 也会自动连接。一旦您执行此操作,您的手机将扫描设备,并在设备出现后连接到它。 唯一中断此调用的事情是手机上关闭了蓝牙或者您的应用程序进程被杀死。为避免进程被杀死,请让您的应用程序具有前台服务。
然而,有一个陷阱,在Android中存在一个错误,有时自动连接会变为直接连接(并在30秒左右取消)。请参见https://code.google.com/p/android/issues/detail?id=69834。您需要使用反射来避免此错误。

感谢您对“自动连接漏洞”的评论!这让我进入了一个我从未探索过的调试路线。在这个答案中,有一个完整的Java解决方案可以解决该问题:https://dev59.com/HoXca4cB1Zd3GeqPMr3E#39269766 - Mark Ch

1

我想我找到了解决方法。

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

因此,当活动启动时(在 MainActivityonResume() 中),我让我的应用与要连接的设备使用MAC地址进行connectGatt连接,并设置autoConnection=True

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


0

我做过类似的应用,没有遇到这样的问题。 作为解决你的问题的最后一招,我建议将BLE设备地址写入简单的DB表中,并手动连接它。 我做了类似这样的事情here。 这不是最佳实践代码,但我希望你可以从中找到解决方案的灵感。


我想要实现的是自动重新连接到BLE设备,无需用户输入。我认为您的应用程序通过点击设备来连接设备。如果我的理解有误,请告诉我。 - beneficial02
初始化正确,但您可以在其他事件上执行类似的操作,例如应用程序启动时或发现新设备时,检查其地址是否已经在数据库中。 - Hristo Staykov
我根据你的代码灵感找到了一个解决方案。谢谢! - beneficial02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接