扫描时如何处理onScanFailed?

时间:2018-01-29 14:30:32

标签: android android-fragments bluetooth-lowenergy

我正在使用以下代码扫描BLE信标。

protected void scanLeDevice(final boolean enable, Context applicationContext) {
    Log.i(TAG, "Scanning start " + type);
    bluetoothManager = (BluetoothManager) applicationContext.getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        mLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
        if (mLEScanner == null)
            throw new IllegalStateException("BT le scanner not available");
        settings = new ScanSettings.Builder().setScanMode(
                ScanSettings.SCAN_MODE_LOW_LATENCY).build();
        filters = new ArrayList<ScanFilter>(1);
    }
    try {
        Log.i(TAG, "In scanLeDevice " + type + ", enable: " + enable);
        if (enable) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Log.i(TAG, "mLEScanner startScan called");
                mLEScanner.startScan(filters, settings, mScanCallback);
            } else {
                mBluetoothAdapter.startLeScan(mLeScanCallback);
            }
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mLEScanner.stopScan(mScanCallback);
            } else {
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在我的Activity中,我正在使用片段&amp;每当显示第一个片段时,我都会调用(在Fragment&#39} onResume()方法中)此方法。扫描工作正常,但如果我将片段切换4-5次,则会调用ScanCallback&#39; onScanFailed方法,错误代码为1,这意味着 SCAN_FAILED_ALREADY_STARTED 无法启动扫描,因为应用程序已启动具有相同设置的BLE扫描。

我只在具有OS 7.0及更高版本的设备中看到此问题。上方。

我可以在这做两件事。首先是我可以确保没有调用onScanFailed()。 其次,再次在scanLeDevice()中调用相同的onScanFailed()方法重新开始扫描。

我尝试了第二种方法,但仍然遇到同样的错误。第一个我不能。

修改 我检查了更多,在某些情况下,如果它失败,那么它仍然能够扫描信标但不总是。这造成了更多困难。

如果有人有任何解决方案,请告诉我。

1 个答案:

答案 0 :(得分:0)

我找到了克服这个问题的方法。现在,每当我看到onFailed()被调用时,我就会启动一个线程(使用Handler),它会在一段时间后重新加载整个片段。如果扫描自动重启,我会删除所有回调。

到目前为止,这个解决方案似乎运行良好。

理想情况下,我应该限制开始和停止扫描调用,但它已经以这种方式实现,所以我不得不尝试这种方式。