Для сканирования на полную мощность, Ваше резюме параметров является точным. Я написал сообщение в блоге об этом, которое взвешивает плюсы и минусы различных вариантов.
В библиотеке Android Beacon мы выбрали использование JobScheduler по умолчанию.Это может выполняться не чаще, чем каждые 15 минут в фоновом режиме.ИМО, сроки являются реальным недостатком этого подхода.Тот факт, что он немного тяжелее и менее эффективен, несущественен, поскольку запуск задания происходит только раз в 15 минут.
Библиотека также недавно добавила поддержку для дополнительной настройки службы переднего плана включить сканирование чаще.Для многих случаев использования постоянное уведомление приемлемо, хотя для других оно является реальным недостатком.
К сожалению, Android не имеет белого списка или специального процесса одобрения, чтобы обойти это ограничение. ВашеЕдинственным вариантом будет, если вы являетесь производителем устройства и можете настроить применение правил в своей собственной версии Android.
Одна из альтернатив, о которой вы не упомянули , которую использует Библиотека маяков Android, - это использоватьновый Android O API, который позволяет вам получать результаты сканирования с намерением BroadcastReceiver
.Это хорошо работает с фильтром сканирования, чтобы разбудить ваше приложение, если обнаружен пакет BLE определенного интереса.Но как только один обнаружен.Ваш процесс не запускается во время этого сканирования, но он может затем запустить фоновый сервис для обычного 10-минутного ограничения на Android 8 после того, как такое обнаружение имеет место.В приведенном ниже примере результаты получены в MyBroadcastReceiver
.
Intent intent = new Intent(mContext, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
int result = bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);
. Используя комбинацию описанных выше методов, большинство приложений для сканирования по Bluetooth все еще могут хорошо работать на Android 8+.