我的 BluetoothAdapter.startLeScan() 在 Lollipop API21 中无法正常工作

My BluetoothAdapter.startLeScan() is not working properly in Lollipop API21

我需要使用 BluetoothLeScanner class 来扫描 Lollipop 的 BLE 设备吗?

Lollipop 中 BluetoothAdapter.startLeScan() 的问题:- 中央设备无法在几个 BLE 扫描时间段内搜索外围设备发送的广告数据包。虽然它在某些扫描间隔内查找广告并执行任务(我的应用程序 objective)。但我希望它在每个时间间隔内都能找到广告。我使用的时间间隔最多为 10 秒。

是否存在棒棒糖兼容性问题?我读到在棒棒糖中使用 startLeScan() 已被弃用,但我们可以使用它并且它应该可以正常工作。我哪里错了?有帮助吗?

问题实际上出在我用于开发的 Nexus 7 设备(也有 nexus 4)上。后来我用nexus 5试了一下我的代码,没有这个问题。

原因: 在 Nexus 4 和 Nexus 7 上,当发现新设备或传感器不可连接时调用回调。在后一种情况下,您会不断获得 RSSI 更新。

可连接设备的广告比不可连接设备更复杂。 它需要另外 2 个数据包:扫描请求和扫描响应。 phone 必须从设备请求更多广告数据。由于 adv 数据可能大于单个数据包中允许的 31 个字节(对于不可连接的设备)。

Nexus 4 和 Nexus 7 每个设备只发送一次扫描请求。如果adv数据包在扫描后到达,它们都不会调用onLeScan回调。

对于不可连接的设备,每次收到 adv 数据包时都会调用回调。 我记得 Nexus 5 对同一设备多次发送扫描请求,但我不确定。

非常令人不安,它在某些设备上的工作方式不同,并且没有指定正确的行为。最好的解决方案是向 startLeScan(boolean showDevicesMultipleTimes) 添加一个参数或将其标准化为 Nexus 5 行为。

Link 对于这个 android 问题:

https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=65863

我建议的 Nexus 7 和 Nexus 4 解决方案: 我将信标切换为不可连接模式,我的代码在所有设备上都运行良好。