在我的Android(API版本21及以上)蓝牙LE应用程序中,应用程序通过使用BluetoothLeScanner和ScanCallback对象扫描外围设备来启动。这在应用程序初次启动几次后正常工作,但是在从Android Studio第几次启动和停止应用程序后,将调用onScanFailed()回调,并显示errorCode为5。该代码甚至未在ScanCallback.java中公开,但源代码显示其声明为public static final int SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES = 5。
当出现此错误时,恢复应用程序的正常行为的唯一方法是关闭并重新打开蓝牙。
这个错误代码似乎完全没有文件记录,而且非常罕见。更有趣的是,在设备发现之后,该应用程序开始使用另一个回调进行扫描,该回调会监听来自设备的广播。即使在最初的发现扫描收到错误代码5后,此扫描会始终可靠地启动。
这两个不同的ScanCallback的设置方式有几个不同之处。
探测扫描仪的设置如下:
同时,带有过滤器的设置如下:
广播扫描器的过滤器为空。 如何避免将BLE子系统置于此状态?为什么会发生这种情况?
当出现此错误时,恢复应用程序的正常行为的唯一方法是关闭并重新打开蓝牙。
这个错误代码似乎完全没有文件记录,而且非常罕见。更有趣的是,在设备发现之后,该应用程序开始使用另一个回调进行扫描,该回调会监听来自设备的广播。即使在最初的发现扫描收到错误代码5后,此扫描会始终可靠地启动。
这两个不同的ScanCallback的设置方式有几个不同之处。
探测扫描仪的设置如下:
ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.also {
if(Build.VERSION.SDK_INT >= 23)
it.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
}
.build()
同时,带有过滤器的设置如下:
ScanFilter.Builder().setServiceUuid(BluetoothUUID.service.parcelUuid).build()
同时,广播监听扫描器的设置如下:ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
广播扫描器的过滤器为空。 如何避免将BLE子系统置于此状态?为什么会发生这种情况?
BluetoothGattCallback
中,当业务完成后使用disconnect()
,并在接收到STATE_DISCONNECTED
时使用close()
。 - idrougge