BLE Scan не работает в фоновом режиме со Scanfilters в Android пирог? - PullRequest
1 голос
/ 19 апреля 2019

Я использую blescan со сканирующими фильтрами для обнаружения маяков, он очень хорошо работает на переднем и заднем плане до версии oreo, но когда дело доходит до пирога Android, он не может отправлять ожидающие трансляции в фоновом режиме.

  ScanSettings settings = (new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)).build();
            final List<ScanFilter> scanFilters = new ArrayList<>();
            scanFilters.add(getScanFilter());

            BluetoothAdapter bluetoothAdapter;
            final BluetoothManager bluetoothManager =   
                    (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
            bluetoothAdapter = bluetoothManager.getAdapter();
            Intent intent = new Intent(this.getApplicationContext(), MyBroadcastReceiver.class);
            intent.putExtra("o-scan", true);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            bluetoothAdapter.getBluetoothLeScanner().startScan(scanFilters, settings, pendingIntent);




public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int bleCallbackType = intent.getIntExtra(BluetoothLeScanner.EXTRA_CALLBACK_TYPE, -1);
        if (bleCallbackType != -1) {
            Log.d(TAG, "Passive background scan callback type: "+bleCallbackType);
            ArrayList<ScanResult> scanResults = intent.getParcelableArrayListExtra(
                    BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);
            // Do something with your ScanResult list here.
            // These contain the data of your matching BLE advertising packets
        }
    }
}


Ответы [ 2 ]

1 голос
/ 19 апреля 2019

В Android 9 введено несколько изменений поведения, таких как ограничение фона доступа приложений к датчикам устройств и сканирования Wi-Fi.

Эти изменения влияют на все приложения, работающие на Android 9, независимо отверсия целевого SDK.

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


Android 9Ограниченный доступ к сенсорам в фоновом режиме:

Android 9 ограничивает фоновые приложения для доступа к пользовательскому вводу и данным сенсора.Если ваше приложение работает в фоновом режиме на устройстве под управлением Android 9, система применяет к вашему приложению следующие ограничения:

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

Датчики, которые используют при смене или однократные режимы отчетности не получают события .


Решение: Если вашему приложению необходимо обнаруживать события датчика на устройствах под управлением Android 9, когда приложение находится в фоновом режиме, используйте службу переднего плана.

0 голосов
/ 06 мая 2019

Я - пример тестового приложения для Android, использующего Oreo (API 26) и приведенный выше код (слегка измененный) для обнаружения маяков. Я использую Pixel 3 XL (с пирогом). Я думаю, что самое сложное в этом состоит в том, чтобы точно знать, выполняется ли код в onRecieve () в MyBroadcastReceiver на самом деле при обнаружении маяка, когда устройство работает только от батареи (отключено от Android-студии и Logcat (USB) ).

Используя Volley (com.android.volley) для отправки HTTP-запроса на локальный http-сервер, я смог продемонстрировать, что он работает так, как задокументировано - т.е. Я могу получить запрос http, когда маяки обнаружены. Тем не менее, Volley отправляет эти запросы только тогда, когда Android не спит или когда он периодически просыпается и подключается к сети - что в моих простых тестах было примерно каждые 15 минут (плюс некоторые вариации), но я получил все маяки ScanResults на моем HTTP-сервер задерживается до 15 минут. Я даже смог удалить приложение из списка запущенных приложений (вы знаете, проводя пальцем вверх, чтобы удалить приложение) и все еще вижу, что onRecieve () в MyBroadcastReceiver получал BLE ScanResults.

Откуда вы знаете, что onRecieve () в MyBroadcastReceiver убивается? Мне очень интересно узнать, откуда вы это знаете.

...