Android BLE сканирование с выключенным экраном (с Galaxy) - PullRequest
0 голосов
/ 06 августа 2020

Я работаю с Galaxy S10, android 10. Из здесь , сканирование BLE с устройствами Samsung требует непустого фильтра сканирования для сканирования в состоянии без экрана.

Ниже показано мой код AdvertiseData и ScanFilter.

ParcelUuid aaUuid = ParcelUuid.fromString("0000aa11-0000-1000-8000-00805F9B34FB");

AdvertiseData advertiseData = new AdvertiseData.Builder()
                .setIncludeDeviceName(true) 
                .addServiceUuid(aaUuid)
                .build();

ScanFilter scanFilter = new ScanFilter.Builder()
                .setServiceUuid(aaUuid)
                .build();

При включенном экране все работает хорошо. Однако с выключенным экраном тоже не работает.

Я установил 10-кратное сканирование, чтобы проверить это. Сначала при включенном экране все работает хорошо. Когда стал выключенным, первое сканирование работает нормально. Но результат следующего сканирования не появляется, и он просто запускает следующий процесс сканирования (без результата).

'WakeLock' для каждого повторения сканирования дает тот же результат. Как решить эту проблему?

Добавить 1. Я использовал WorkManager для обработки фонового процесса. Тогда я искал другой метод.

Добавить 2. Ниже мой код обратного вызова.

private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            if (result.getDevice().getName() != null)
                setBleScanResult(result);
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            super.onBatchScanResults(results);
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
            Log.d("LOG_BLESCANNING_onScanFailed", "Error Code : " + errorCode);
        }
    };

Добавить 3. Ниже мой журнал при выключенном экране

...
D/Worker: ============ Bluetooth Scanning start ============
D/LOG_BluetoothScan: Bluetooth scanning started successfully
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=4 mScannerId=0
D/BluetoothAdapter: isLeEnabled(): ON
D/LOG_BluetoothScan: Bluetooth scanning stopped
...

и экран на

D/Worker: ============ Bluetooth Scanning start ============
D/LOG_BluetoothScan: Bluetooth scanning started successfully
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=4 mScannerId=0
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/BluetoothAdapter: isLeEnabled(): ON
D/LOG_BluetoothScan: Bluetooth scanning stopped

Добавьте 4. Мне любопытно: «Почему эта проблема возникает только при сканировании изображения?» Проверяю, что реклама в выключенном состоянии не вызывает никаких проблем.

Добавить 5. С рекламой тоже есть проблема ... но это несущественно. Я считаю, что соединение MainActivity - Worker (из WorkManager) плохо для контроля этой ситуации.

Ответы [ 2 ]

0 голосов
/ 19 августа 2020

Вот как я решаю проблему

  1. Используйте ForegroundService
  • Я не проверял, доступен ли workmanager или нет, но ForegroundService работает хорошо. Я использую таймер и timertask, чтобы повторить процесс на переднем плане.
Предоставить разрешение «Разрешено постоянно»
  • Это была основная проблема. В режиме ожидания мое приложение не может использовать GPS. Итак, я открываю настройку GPS и устанавливаю для своего приложения разрешение «Разрешить» при использовании приложения, чтобы разрешить все время.
0 голосов
/ 06 августа 2020

это мой рабочий код - даже экран устройства заблокирован.

ОБНОВЛЕНИЕ:

спасибо, что упомянули, что вы использовали " WorkerManager ". После этого только пришло в голову. Начиная с android 8, Google ввел оптимизацию заряда батареи, такую ​​как режим Doze. Таким образом, он не позволяет службе работать в фоновом режиме во время сна (режим сна). Итак, вы можете выполнить сканирование BLE **

, используя «Foreground Service»

** вместо Worker или Jobscheduler, и т. Д. c.

просмотрите эту ссылку: https://developer.android.com/training/monitoring-device-state/doze-standby

Я тоже боролся на этом этапе 2 года go. После переключения на "Forgreound Service" он работает

OLD (инициализация в отношении - сканирование BLE), пожалуйста, проверьте свой код. Это просто. Жду вашего ответа.

1. Инициализировать фильтр сканирования

    btLeScanFilters = new ArrayList<ScanFilter>();
    ScanFilter scanFilter = new ScanFilter.Builder()
            .setServiceUuid(new ParcelUuid("........ uuid reference ......"))
            .build();
    btLeScanFilters.add(scanFilter);

2. Инициализировать настройки сканирования

    btLeScanSettings = new ScanSettings.Builder().

setScanMode (ScanSettings.SCAN_MODE_LOW_LATENCY) .build ();

3. Инициализировать обратный вызов сканирования

   private ScanCallback leScanCallback = new ScanCallback() {

    @Override
    public void onScanResult(int callbackType,
                             final ScanResult result){

        new TPMSAsyncTask().execute(result);
    }
   }

4. начать сканирование

    btLeScanner.startScan(btLeScanFilters, 
               btLeScanSettings,
               leScanCallback);
        
   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...