Переход PendingIntent по геозоне заблокирован ОС на Android Oreo

Это происходит только на Android Oreo. Я использую Play Services 11.4.2. Я регистрирую геозоны с помощью GeofencingClient и метода addGeofences с pendingIntent для IntentService, который обрабатывает переходы между геозонами. Похоже, что намерение, отправленное игровыми сервисами, блокируется ОС при определенных условиях.

Система регистрирует следующее:

Background start not allowed: service Intent { cmp=my.app.id/my.package.struct.GeofenceTransIntentService (has extras) } to my.app.id/my.package.struct.GeofenceTransIntentService from pid=-1 uid=10154 pkg=my.app.id

как только я добавлю геозону в следующих ситуациях:

  • когда я добавляю его после загрузки устройства
  • когда я добавляю его после того, как приложение было удалено. В обоих случаях приложение фактически уже работает в фоновом режиме (поскольку я могу запустить код, который добавляет геозону), потому что я слушаю PROVIDERS_CHANGED, BOOT_COMPLETED.

person stefano cattaneo    schedule 25.10.2017    source источник
comment
Не могли бы вы показать нам код, который вы используете?   -  person Doggo    schedule 25.10.2017


Ответы (2)


Это вызвано новыми ограничениями фоновой службы Android Oreo.

Вы должны изменить PendingIntent с использования Service на использование BroadcastReceiver.

Дополнительные сведения и примеры см. в этой CodeLab. код.

person pincopallino    schedule 27.10.2017
comment
Я просто переключился на широковещательный приемник, и это сработало! Большое спасибо. - person stefano cattaneo; 27.10.2017
comment
Пример касается обновлений местоположения, а не геофекций. Кроме того, первый комментарий на developers.google.com/ android/reference/com/google/android/gms/ is Этот интерфейс устарел. Есть ли лучший пример кода GeofenceAPI для Android Oreo? - person Marcin; 26.07.2018
comment
См. мой ответ на связанный вопрос для получения более подробной информации о том, как справиться с этим на Android O и более поздних версиях. - person Michael Krause; 13.08.2018

В дополнение к переключению на BroadcastReceiver, как указано в принятом ответе, я хотел бы отметить, что, хотя вы по-прежнему будете получать BOOT_COMPLETED, вы больше не сможете получать PROVIDERS_CHANGED.

PROVIDERS_CHANGED является неявной широковещательной рассылкой и не входит в список широковещательные исключения.

BOOT_COMPLETED находится в списке исключений широковещательной рассылки, поэтому вы все равно получу.

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

person Michael Krause    schedule 07.09.2018