我正在使用以下代码扫描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()
方法重新开始扫描。
我尝试了第二种方法,但仍然遇到同样的错误。第一个我不能。
修改 我检查了更多,在某些情况下,如果它失败,那么它仍然能够扫描信标但不总是。这造成了更多困难。
如果有人有任何解决方案,请告诉我。
答案 0 :(得分:0)
我找到了克服这个问题的方法。现在,每当我看到onFailed()
被调用时,我就会启动一个线程(使用Handler
),它会在一段时间后重新加载整个片段。如果扫描自动重启,我会删除所有回调。
到目前为止,这个解决方案似乎运行良好。
理想情况下,我应该限制开始和停止扫描调用,但它已经以这种方式实现,所以我不得不尝试这种方式。