安卓蓝牙LE扫描失败,原因是硬件资源不足。

5
在我的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的设置方式有几个不同之处。
探测扫描仪的设置如下:
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子系统置于此状态?为什么会发生这种情况?

确保在断开蓝牙连接后执行Gatt.disconnect和gatt.close操作。 - AGdev
BluetoothGattCallback中,当业务完成后使用disconnect(),并在接收到STATE_DISCONNECTED时使用close() - idrougge
2个回答

2
解决这个问题的方法不是使用ScanSettings.CALLBACK_TYPE_FIRST_MATCH。由于安卓设备种类繁多,所以效果因人而异。

0

进行如下配置:

      new ScanSettings.Builder ()
                     .setScanMode (ScanSettings.SCAN_MODE_BALANCED)
                     .setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                     .build (),...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接