Я пишу сканер BLE, который сканирует периферийные устройства, подключается и отключается так часто.
Я "зацикливаю" сканирование - выключаю его на 2 секунды и затем снова включаюза 10 - потому что я где-то читал (постараюсь найти ссылку), что в противном случае (после Android 7.0) ОС перестанет сканировать в фоновом режиме через 30 минут или около того.Я также испытал что-то на этот счет.
Проблема в том, что на некоторых устройствах (например, Motorola Moto Z и Google Pixel) я получаю сообщение об ошибке SCAN_FAILED_ALREADY_STARTED , указывающее, что это приложениеуже запустил сканирование с этими параметрами.
Но, с помощью моего алгоритма сканирования, я заставляю stopScan
вызываться обязательно перед попыткой запуска сканирования.Вот соответствующий пример кода, который выдает ошибку на упомянутых устройствах.Это ТОЛЬКО сканирующая часть кода.
private final int SCANNER_DOWN_TIME = 2000;
private final int SCANNER_LIFETIME_MS = 10000;
private Runnable runnable = new Runnable() {
private BluetoothLeScanner scanner;
final ScanSettings.Builder builder = new ScanSettings.Builder();
final ScanSettings settings = builder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
public void run() {
try {
bootScanner();
} catch (Exception e) {
Sentry.capture(e);
}
}
class StartScannerAndScheduleReboot implements Runnable {
@Override
public void run() {
if (bluetoothAdapter.isEnabled()) {
scanner = bluetoothAdapter.getBluetoothLeScanner();
if (scanner != null) {
scanner.startScan(null, settings, sensorReadingHandler);
}
} else {
bluetoothAdapter.enable();
}
bootScanHandler = new Handler(Looper.getMainLooper());
bootScan = new RebootScanner();
bootScanHandler.postDelayed(bootScan, SCANNER_LIFETIME_MS);
}
}
class RebootScanner implements Runnable {
@Override
public void run() {
bootScanner();
}
}
private void bootScanner() {
try {
scanner.stopScan(sensorReadingHandler);
} catch (Exception e) {
/* We can ignore this - there are cases that this will happen & it's ok */
}
startScanHandler = new Handler(Looper.getMainLooper());
startScan = new StartScannerAndScheduleReboot();
startScanHandler.postDelayed(startScan, SCANNER_DOWN_TIME);
}
private ScanCallback sensorReadingHandler = new ScanCallback()
{ /* I don't believe the scanCallback code is relevant, as this happens before any connections are even attempted. */ }
};
Неудивительно, что приложение все еще может читать BLE-передачи, но некоторые из них отбрасываются.Это заставляет меня поверить, что я не должен просто игнорировать эту ошибку.