【问题标题】:Android Bluetooth Le scanner stops after a timeAndroid 蓝牙 Le 扫描仪在一段时间后停止
【发布时间】:2017-05-07 16:30:50
【问题描述】:

我正在使用活动的蓝牙 LE 扫描仪运行应用程序或服务,并在日志控制台上显示扫描结果。如果我把手机锁在桌子上不再碰。一段时间后它停止了,它没有给我更多的扫描结果。

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

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

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

在我的 Nexus 5 和 Android 7.1.1 中运行 APP 并锁定屏幕,不再触摸手机。时间是30分钟。手机单独在一个桌子上,只有连接microusb才能看到android studio中的日志。

在其他带有android 7.1 的Moto G2 中完全通过但时间在20 分钟到40 分钟之间,比较随意。手机单独在一个桌子上,只有连接microusb才能看到android studio中的日志。

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

这个是用来做beacon结果的,我先用Android Beacon Library做这个,结果是一样的。

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

当手机长时间处于锁定状态时,是否有任何形式使用蓝牙扫描仪 LE 始终在 Android 中运行??

提前致谢。

最好的问候。

【问题讨论】:

  • 如果我每 10 分钟在手机中设置一次警报并锁定屏幕,然后在接下来的 10 分钟内设置其他警报,则扫描仪 BLE 永远不会停止。但是,如果我设置了外部警报并且仅每 10 分钟移动一次手机而不解锁手机,则锁定屏幕 30 分钟后扫描仪将停止读取。
  • 我没有表格让扫描仪在后台模式下进行所有测试后始终运行而不接触手机。

标签: android bluetooth


【解决方案1】:

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

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

【讨论】:

  • 这个奇怪的新“功能”的真正意义是什么?有很多应用程序需要在后台持续扫描 BLE 设备,而这个新的“功能”打破了这些应用程序。在 30 分钟后停止扫描感觉非常随意,尤其是在应用程序已经使用“低功耗”扫描模式的情况下。程序员现在只是使用计时器在 30 分钟后重新启动它作为一种解决方法。
  • 是的。一个好处是在程序员不经意间离开扫描的情况下节省电池。
  • @davidgyoung,当我将它发布到 github github.com/AltBeacon/android-beacon-library/issues/506 时,您帮助了我并解决了我的问题。感谢您的帮助。
  • 对于任何想知道的人来说,这仍然是 android 11 中的一个“功能”。整数已移动到一个名为 AppScanStats 的文件中,此处为 android.googlesource.com/platform/packages/apps/Bluetooth/+/… 在我的应用程序中,我们每 15 分钟停止并重新启动一次扫描,绕过这个限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多