在我的 Android(API 版本 21 及更高版本)蓝牙 LE 应用程序中,应用程序首先使用BluetoothLeScanner和ScanCallback对象扫描外围设备。
这在应用程序启动的前几次工作正常,但是在从 Android Studio 启动和停止应用程序几次后,回调函数onScanFailed()将被调用为errorCode5。此代码甚至没有被 ScanCallback.java 公开,但来源表明它被声明为public static final int SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES = 5.
当出现此错误时,恢复应用程序正常行为的唯一方法是关闭蓝牙然后再次打开。
这个错误代码似乎完全没有记录,而且是罕见的。更有趣的是,在设备发现后,应用程序开始使用另一个侦听设备广播的回调进行扫描。即使在初始发现扫描收到错误代码 5 之后,此扫描会话也始终会可靠地启动。
两个不同 s 的设置ScanCallback在几个方面有所不同。
发现扫描仪的设置如下:
ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.also {
if(Build.VERSION.SDK_INT >= 23)
it.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
}
.build()
Run Code Online (Sandbox Code Playgroud)
还有一个过滤器:
ScanFilter.Builder().setServiceUuid(BluetoothUUID.service.parcelUuid).build()
同时,广播监听扫描仪的设置如下:
ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
Run Code Online (Sandbox Code Playgroud)
广播扫描仪的过滤器为空。
如何避免 BLE 子系统处于这种状态,为什么会发生这种情况?