问题:BLE Scan failed, reason app registration failed for UUID
起因:我在进行压力测试,每次都扫描并连接同一个BLE蓝牙设备,然后传输数据,接着断开,如此重复10多次,但是一般在第7次左右或后面就会报该错误。
猜测:这应该是读写数据或者扫描的数据把BLE堆栈占满了,亦或是之前申请的空间没有被正确释放等等。总之目前可以确定是Android BLE 框架层的问题,非应用本身的问题。我测试用了Android4.4华为、Android5.0联想、Android6.0三星,均能复现该问题。一般错误码为SCAN_FAILED_APPLICATION_REGISTRATION_FAILED = 2。
在stackoverflow上看到一篇文章:
http://stackoverflow.com/questions/35376682/how-to-fix-android-ble-scan-failed-application-registration-failed-error
这位仁兄给出的结论也和我一样,唯一的解决方案就是当捕获到该错误时,重启蓝牙,但是缺点是需要用户确认。
@Override
public void onScanFailed(int errorCode) {
bluetoothScanCallback.onScanFail(errorCode);
if (bluetoothAdapter != null) {
// 一旦发生错误,除了重启蓝牙再没有其它解决办法
bluetoothAdapter.disable();
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//要等待蓝牙彻底关闭,然后再打开,才能实现重启效果
if(bluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF) {
bluetoothAdapter.enable();
break;
}
}
}
}).start();
}
}
但是问题由来了,只有在API>21(5.0)的时候,官方才提供BluetoothLeScanner和BleScanCallback用于捕获该异常,那也就是说API 18(Android 4.4)使用的LeScanCallback是无法捕获到该异常的。
另外,我在 Android 7.1 的 Oppo r11 手机上测试发现,扫描蓝牙需要精确的位置权限(FINE_LOCATION),模糊的位置权限(COARSE_LOCATION)是无法搜索到蓝牙的。