Ваше краткое изложение трех вариантов долгосрочного сканирования по Bluetooth с Android 8+ в основном верно.Вы не можете выполнять постоянное фоновое сканирование без постоянного уведомления.Вы можете:
- Выполнять периодическое сканирование с использованием JobScheduler.Вы можете выполнять сканирование до 10 минут каждые 15 минут.
- Запуск службы переднего плана, которая может поддерживать постоянное сканирование, продолжающееся вечно, но за счет постоянного уведомления, указывающего пользователю, что ваше приложение активнои используя батарею.
- Используйте сканирование по назначению, чтобы всегда искать байтовый шаблон в объявлении Bluetooth.Это работает только на Android 8+, но если все сделано правильно, вы, безусловно, можете разобрать идентификаторы маяка из пакета.
Библиотека маяков Android с открытым исходным кодом по умолчанию использует оба параметра (1) и (2) на Android 8+.Он использует опцию сканирования по назначению, когда периодическое сканирование неактивно, что, по сути, позволяет постоянно обнаруживать новые маяки.
Непонятно, почему вы не смогли проанализировать идентификатор из полученных пакетовпутем сканирования на основе намерений, поскольку вышеупомянутая библиотека успешно справилась с этим на нескольких устройствах Android 8.Возможно, фильтр был настроен на широкий диапазон, чтобы он соответствовал пакетам, которые не содержали ожидаемых идентификаторов?
Вы можете увидеть код, который работает из библиотеки здесь :
ArrayList<ScanResult> scanResults = intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);
Код выше тот же, который вы используете.Расшифровка происходит здесь .
Как видно из второй ссылки, обнаружение фона не только анализирует записи из Intent, но также заставляет библиотеку использовать JobScheduler для планирования расписания.постоянное сканирование (кратко).Таким образом, даже если по какой-то причине у вас есть устройство, которое не передает результаты сканирования успешно из сканирования на основе Intent, методика запуска временного сканирования с JobScheduler после получения Intent будет захватывать и декодировать последующее объявление, еслимаяк появился поблизости и регулярно передает.