启用BLE扫描后需要等待多长时间?

时间:2019-12-23 15:16:41

标签: android bluetooth-lowenergy

在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。

我的问题是,有没有比上述方法更好的解决方案?

1 个答案:

答案 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);