Android 蓝牙 Le 扫描仪在一段时间后停止

标签 android bluetooth

我正在使用 Activity 的低功耗蓝牙扫描仪运行应用程序或服务,并在日志控制台上显示扫描结果。如果我 Handlebars 机锁在 table 上不再碰了。一段时间后它停止了,并且没有给我更多的扫描结果。

如果我按下电源按钮并唤醒屏幕,它会给我更多的扫描结果。如果我再次锁定屏幕或等待自动锁定,它会停止并且不会给我更多扫描结果。

我使用服务和应用程序进行测试,通过日志给我更多结果,看到应用程序正在运行,但扫描仪 LE 停止并且在屏幕锁定时没有给我更多结果。

我的应用程序处于休眠模式的“无优化电池”状态。我通过命令强制引入手机打瞌睡模式进行了测试,工作正常,它给我扫描结果。

在我的 Nexus 5 和 Android 7.1.1 运行应用程序时通过并锁定屏幕并且不再触摸手机。时间是30分钟。手机单独放在一个 table 上,只用microusb连接在android studio里看log。

在其他搭载 android 7.1 的 Moto G2 中正好通过,但时间在 20 分钟到 40 分钟之间,比较偶然。手机单独放在一个 table 上,只用microusb连接在android studio里看log。

为了再次运行良好,我需要手动强制关闭应用程序并重新启动,否则仅在屏幕处于 Activity 状态时有效,而在屏幕锁定时不会给我更多结果。

这用于信标结果,首先我使用 Android Beacon Library 来达到这个目的,结果是一样的。

我认为这是 android 蓝牙组件的问题,因为我与 Android Beacon 库有相同的结果,或者如果我实现了我自己的 BLE 扫描器,但我不知道如何解决这个问题。

当手机长时间处于锁定状态时,是否有任何形式可以使用 Bluetooth Scanner LE 始终在 Android 中运行??

提前致谢。

最好的问候。

最佳答案

Android 7.0 引入了 BLE 扫描超时,任何运行 30 分钟或更长时间的扫描都会有效地自动停止,并且只会“机会性地”恢复,这实质上意味着如果另一个进程进行扫描,它也可以获得结果。

您可以通过设置代码来启动蓝牙 LE 扫描并使其无限期运行来看到这一点。恰好 30 分钟后,扫描将停止,您将在 LogCat 中看到如下条目:

06-11 19:00:22.848  5123  5147 D BtGatt.ScanManager: clientIf set to scan opportunisticly: 6
06-11 19:00:22.848  5123  5147 D BtGatt.ScanManager: configureRegularScanParams() - queue=1
06-11 19:00:22.848  5123  5147 D BtGatt.ScanManager: configureRegularScanParams() - ScanSetting Scan mode=-1 mLastConfiguredScanSetting=2
06-11 19:00:22.848  5123  5147 D BtGatt.ScanManager: configureRegularScanParams() - queue emtpy, scan stopped
06-11 19:00:22.849  5123  5147 D BtGatt.ScanManager: stop scan

您可以在此处的 AOSP 源代码中查看执行此操作的代码:

https://android.googlesource.com/platform/packages/apps/Bluetooth/+/android-7.0.0_r1/src/com/android/bluetooth/gatt/ScanManager.java#72

解决此问题的方法是不要让扫描持续那么长时间。您可以简单地停止它们并定期重新启动它们。

关于Android 蓝牙 Le 扫描仪在一段时间后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43833904/

相关文章:

java - 在 android 中带有复选框的 AlertDialog

android - 从市场以外的网站以编程方式在 Android 设备上下载、安装和删除 .apk 文件

python - Windows环境下如何使用python扫描BLE设备与通信

ios - 核心蓝牙功能

ios - 使用 CoreBluetooth 传输数据

java - Android 音乐附属/关联程序

android - 让产品 flavor 成为另一个的 child

android - 将多个字符串传递给其他 Activity

android - 如何通过蓝牙将 Android 应用程序连接到 Raspberry Pi,以便发送数字文本文件?

iOS:无法让蓝牙管理器工作