安卓BLE扫描-无法在屏幕关闭时启动未经过滤的扫描



我面临与BLE广告扫描相关的问题。在关闭屏幕后,我的扫描工作了一段未定义的时间,然后停止,直到我打开屏幕;无法在屏幕关闭时启动未经过滤的扫描";。

我提供像下面这样的扫描过滤器

class IBeaconScanFilterProvider : BeaconScanFilterProvider {
override fun get(uuid: UUID): ScanFilter {
val manufacturerData = ByteBuffer.allocate(23)
val manufacturerDataMask = ByteBuffer.allocate(23)
val uuidBytes = getByteArrayFromGuid(uuid.toString())!!
for (i in 2..17) {
manufacturerData.put(i, uuidBytes[i - 2])
manufacturerDataMask.put(i, 0x01)
}
return ScanFilter.Builder()
.setManufacturerData(
0x004C, //IBeacon
manufacturerData.array(),
manufacturerDataMask.array()
).build()
}
}

然后我开始使用以下的代码进行扫描

bluetoothScanner.startScan(
arrayListOf(beaconScanningContext.filters),
beaconScanningContext.settings,
RxBleBroadcastReceiver.newPendingIntent(context)
)

每10分钟我都会重置扫描,以避免10分钟后关闭扫描的锁定,添加在android 8 中

我在Android 5.1(LG G2(、Android 7.1.1(Nexus 6P(、Android 8.1(Pixel XL(和Android 10(小米Mi9(上测试此解决方案,Pixel和Mi9 上出现问题

我做错什么了吗?

您所描述的方法是合理的。您需要定期重新启动扫描,否则扫描将停止,这是正确的。这一变化发生在Android 7.0上,它应该是在扫描30分钟后(尽管可能有些OEMS已经自定义了这一点(

对没有扫描过滤器的背景扫描的限制始于Android 8.1,OEM之间的执行略有不同。在Pixel和AOSP手机上,任何扫描过滤器都可以工作,即使是空的。在三星需要一个非空扫描过滤器。请参阅此处了解更多信息。

目前尚不清楚为什么您的扫描筛选器无法解决此问题。IBeaconScanFilterProvider创建的过滤器看起来足够了,但从显示的代码中我看不出beaconScanningContext.filters返回了什么。您确定这是在返回一个至少包含一个元素的数组,该数组具有非空扫描筛选器吗?如果是这样的话,它应该会起作用。

最新更新