牛轧糖中的蓝牙扫描在一段时间后停止

Bluetooth scanning in Nougat stops after some time

我有一个扫描信标的应用程序。我在 Lollipop 和 Oreo 中没有遇到任何问题,但是在 Marshmellow 和 Nougat 中,一段时间后(大约 90 分钟)没有检测到信标。我在网上看到牛轧糖在 30 分钟后停止扫描,因此我 stop/start 每 5 分钟扫描一次。我观察到的事情 -

1) 所有设备同时测试,因此我确定信标传输没有问题。

2) wifi 关闭时我观察到持续扫描。

3) 停止扫描后,设备不会在“设置”选项卡上显示附近的任何蓝牙设备(可能是蓝牙坏了?)

4) Battery historian 显示 ble_scanning 一直开启

5) 重启蓝牙解决问题,开始扫描。我不想在应用程序中每次都引入 off/on 蓝牙。

我遇到了这个 post https://github.com/AltBeacon/android-beacon-library/issues/289 但 post 是 Lollipop 的,我没有遇到问题。它谈到设置 beaconManager.setAndroidLScanningDisabled(true)。目前,我没有使用图书馆。有什么办法可以解决这个问题吗? 我正在使用 XCody Y19 设备 Android 7.0

除非您在 Android 6.x 和 7.x 的不同制造商的多个设备型号上重现了此问题,否则我认为此问题更有可能是特定于设备的。它可能由蓝牙芯片或 ROM 中将蓝牙硬件桥接到 Android 蓝牙堆栈的设备特定固件引入。

虽然这只是基于您问题中有限数据样本的推测,但我在华为、三星 J3、Moto E3 和 Moto G5 设备上看到过类似问题 运行 Android 6.x 和 7.x。但我没有在 Nexus 设备 运行 Android 6.x 和 7.x 上看到此类问题。因此,我认为类似的问题可能不是 OS 特有的。

虽然它并不理想,但循环为蓝牙供电是 Android 应用程序对蓝牙堆栈的少数控制手段之一。它有时(但不总是)可以清除不存在其他 API 的低级蓝牙堆栈问题。出于这个原因,一个可选的 BluetoothMedic 被添加到 Android Beacon 库中,用于查找蓝牙堆栈崩溃并(可选)在发现此类问题时循环打开蓝牙电源。这使您可以忽略此类问题并专注于您的应用程序逻辑。

虽然我知道您没有使用该库,但如果您有兴趣,可以从此处的拉取请求中复制 BluetoothMedic class 的源代码:https://github.com/AltBeacon/android-beacon-library/pull/644