在Android中,在设备上启用蓝牙后,无法直接开始蓝牙扫描。如果这样做,则会出现以下错误:
D/BluetoothLeScanner: Scan failed, reason: app registration failed
已实现的onScanFailed
中将以错误代码2调用ScanCallBack
方法。导致此错误的原因知之甚少。但是我发现了以下内容(经过几个小时的尝试):
如果您在启用蓝牙后等待约5秒钟,然后开始扫描(因此不能直接进行扫描),则它可以工作。扫描从成功开始。我通过以下问题的第一个答案提出了此临时解决方案:Android BLE: "Scan failed, reason app registration failed for UUID"
如您所见,这个问题已经存在了一年多,但是发问者正在使用一个单独的Android库来处理BLE。
我的问题是,有没有比上述方法更好的解决方案?
答案 0 :(得分:0)
启用蓝牙适配器后,它需要一些时间才能实际完成所需的所有初始化,因此不允许您开始扫描。
您可以使用以下广播接收器捕获适配器打开事件的广播事件:
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
if (state == BluetoothAdapter.STATE_OFF || state == BluetoothAdapter.STATE_TURNING_OFF) {
if (state == BluetoothAdapter.STATE_TURNING_OFF) {
onBluetoothDisabling();
} else {
onBluetoothDisabled();
}
requestEnableBluetooth();
} else if (state == BluetoothAdapter.STATE_ON) {
onBluetoothEnabled();
}
}
}
};
另外,使用onCreate()
方法注册广播接收器:
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver, filter);