BLE SCAN_FAILED_ALREADY_STARTED (код ошибки 1) только на некоторых устройствах - PullRequest
0 голосов
/ 08 октября 2018

Я пишу сканер 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-передачи, но некоторые из них отбрасываются.Это заставляет меня поверить, что я не должен просто игнорировать эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...