Android BLE Scan failed, reason app registration failed for UUID

问题:BLE Scan failed, reason app registration failed for UUID

Android BLE Scan failed, reason app registration failed for UUID_第1张图片

起因:我在进行压力测试,每次都扫描并连接同一个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)是无法搜索到蓝牙的。

你可能感兴趣的:(#,Android,Bluetooth)