Как получить PROVIDERS_CHANGED трансляцию в Android Oreo - PullRequest
0 голосов
/ 28 августа 2018

Приложения обрабатывают GeoFence для получения PROVIDERS_CHANGED трансляции с:

  1. Зарегистрированные геозоны будут удалены, когда оба провайдера локации (сеть и GPS) выключены.
  2. Когда включен один из 2 провайдеров местоположения, приложение должно зарегистрироваться Геозоны для работы. Это должно быть выполнено без запроса пользователя на запуск мое приложение снова.

Итак, мое приложение регистрирует свой широковещательный приемник в манифесте. Но он больше не работает в Android Oreo, так как PROVIDERS_CHANGED - это не то, что мы можем сделать так, как раньше.

Я могу зарегистрировать широковещательный приемник для этого в приложении или в сервисе, но он рано или поздно завершит работу (завершит свой жизненный цикл), тогда мне нужно отменить его регистрацию. Мое приложение начинает работать после некоторых событий, таких как переход GeoFence, но получение PROVIDERS_CHANGED крайне важно для его работы.

Я подтвердил PROVIDERS_CHANGED не может быть получен получателем, зарегистрированным в манифесте в Android Oreo. Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 04 марта 2019

@ Tomcat и @ Virat18 - я натолкнулся на решение о том, что вы больше не можете регистрировать широковещательный приемник в своем манифесте, чтобы получать фильтр действий Intent PROVIDERS_CHANGED в Android-OREO ..

Решение? Просто зарегистрируйте ваш BroadcastReceiver динамически (из вашего кода), а не из манифеста. Кроме того, вместо проверки на жестко заданное регулярное выражение android.location.PROVIDERS_CHANGED, вы должны использовать LocationManager.PROVIDERS_CHANGED_ACTION (и, конечно, импортировать LocationManager).

Вот пример кода, который я использовал, чтобы заставить это работать! (например: от нажатия кнопки):

public void buttonClick(View view) {

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.location.PROVIDERS_CHANGED");

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().matches(LocationManager.PROVIDERS_CHANGED_ACTION)) {
                Log.i(TAG, "Action MATCHES LocationManager.PROVIDERS_CHANGED_ACTION!");
            }
        }
    };

    this.getApplicationContext().registerReceiver(receiver, filter);
    Log.i(TAG, "RECEIVER HAS BEEN REGISTERED");

}

Кроме того, не забудьте отменить регистрацию получателя в вашем коде соответствующим образом.

Если вы считаете это хорошим решением, примите его как ответ .
Счастливого кодирования!

PS. Он будет продолжать получать трансляцию из фона, даже когда пользователь покидает вашу активность (нажимает кнопку «назад», кнопку «домой» и т. Д.). Однако, если пользователь закрывает ваше приложение с помощью кнопки многозадачности, оно больше не будет получить, так что примите это к сведению.

...