对于特定应用程序,我需要保持 Android 蓝牙扫描 LE 设备,但我发现它会自行停止,而无需登录某些设备。我的示例代码如下:
mBluetoothLeScanner.startScan(null, mScanSettings, leScanCallback);
我确信我从来没有打电话
mBluetoothLeScanner.stopScan(leScanCallback)
所以我尝试查看“btsnoop_hci.log ”。我发现 Controller 在一段时间内没有向主机发送广播消息,可能是5分钟或10分钟以上。在此示例中,它在 864.833537 秒处停止。有人帮我解决这个问题吗?
最佳答案
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 源代码中查看执行此操作的代码:
解决这个问题的方法是不要让扫描持续那么长时间。您只需停止它们并定期重新启动它们即可。
编辑:
关于android - 保持 Android 蓝牙扫描但它自行停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523245/