2016-04-28 39 views
2

我想知道的:android系统如何自动连接到配对设备?

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

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

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

为什么我问:

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

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

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

在此先感谢。

更新:

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

+0

将耳机看作是一个例子:扫描对于传统蓝牙与BLE完全不同。 –

回答

0

我做了一个类似的应用程序,我没有问题。作为您的问题的最后一招,我会建议将BLE设备地址写入简单的数据库表并手动连接到它。我做了这样的事情here 。这不是最佳实践代码,但我希望你能找到适合你的解决方案。

+0

我想做的是自动重新连接到BLE设备,无需用户输入。我认为你的应用通过点击设备连接到设备。如果我的理解错误,请告诉我。 – beneficial02

+0

更正初始化,但您可以在其他事件上做类似的事情,例如,当应用程序启动或发现新设备时,检查其地址是否已存在于数据库中。 –

+0

我发现了一个基于灵感来自你的代码的想法的解决方案。谢谢! – beneficial02

1

我想我找到了解决方案。

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

所以我做了我的应用程序connectGattautoConnection=True到我想要的设备,使用MAC地址,当活动(在MainActivityonResume())开始。

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

2

执行connectGatt(XXX, true, XXX)是正确的方法。 gatt.connect()也开始自动连接。一旦你执行了,你的手机将扫描设备,一旦它出现,它连接到它。如果手机上的蓝牙关闭或者您的应用程序进程被终止,唯一中断此通话的事件是。为了避免你的程序被杀,让你的应用程序有一个前台服务。

然而,有一个错误在Android中,它有时会使自动连接做一个直接连接,而不是(大约30秒后取消)。见https://code.google.com/p/android/issues/detail?id=69834。你需要使用反射来避免这个错误。

+0

感谢您对autoconnect bug的评论!,它让我失望了一条我从未调查过的调试路线。这个答案中有一个完整的java解决方法:http://stackoverflow.com/a/39269766/5414907 –

相关问题