Фоновое сканирование на Android 8+ - PullRequest
0 голосов
/ 27 декабря 2018

На этот вопрос уже можно ответить, но мы хотели бы получить явное подтверждение.

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

Мы нашли сообщение в блоге Дэвида Янга решаем этопопробовать, как бы мы ни нашли двух блокировщиков

  1. Мы не можем получить идентификатор маяка из данных, которые мы получили из ScanRecord, которые мы получаем из результатов сканирования в нашемшироковещательный приемник (см. код ниже)

  2. Мы по-прежнему не можем непрерывно сканировать в фоновом режиме, и периодическое сканирование не подходит для нашего варианта использования.

    ArrayList scanResults= intent.getParcelableArrayListExtra (BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);ScanRecord record = scanResults.get (0) .getScanRecord ();

Мы нашли обходной путь для этой проблемы, запустив фоновое сканирование с помощью Google Awareness Fence API и запуск службы, отвечающей за сканирование, в качестве службы переднего плана, используя startForegroundService , чтобы запустить службу, а затем вызвать startInForeground () в экземпляре службы, чтобы показать постоянное уведомление с указанием действия, которое мы выполняемМы работаем в «фоновом режиме», этот подход хорошо работает для нашего варианта использования, как бы то ни было, но за счет показа этого уведомления, которое не создает хорошего пользовательского опыта.

, мы хотели бы знать, если кто-нибудьнашел лучшее решение для этой проблемы, потому что из документации Google выглядит, что фоновое сканирование - это то, что мы больше не сможем сделать

1 Ответ

0 голосов
/ 27 декабря 2018

Ваше краткое изложение трех вариантов долгосрочного сканирования по Bluetooth с Android 8+ в основном верно.Вы не можете выполнять постоянное фоновое сканирование без постоянного уведомления.Вы можете:

  1. Выполнять периодическое сканирование с использованием JobScheduler.Вы можете выполнять сканирование до 10 минут каждые 15 минут.
  2. Запуск службы переднего плана, которая может поддерживать постоянное сканирование, продолжающееся вечно, но за счет постоянного уведомления, указывающего пользователю, что ваше приложение активнои используя батарею.
  3. Используйте сканирование по назначению, чтобы всегда искать байтовый шаблон в объявлении 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 будет захватывать и декодировать последующее объявление, еслимаяк появился поблизости и регулярно передает.

...