FusedLocationProviderClient.getCurrentLocation(): фоновые приложения, вызывающие этот метод, будут регулироваться в соответствии с ограничениями фонового местоположения.

В документы для FusedLocationProviderClient.getCurrentLocation() говорят следующее:

Этот метод может возвращать местоположения, которым несколько секунд, но никогда не возвращает более старые местоположения. Это подходит для приложений переднего плана, которым требуется одно свежее текущее местоположение.

Фоновые приложения, вызывающие этот метод, будут ограничены ограничениями фонового местоположения, поэтому фоновые приложения могут обнаружить, что метод чаще возвращает нулевые местоположения.

Каковы последствия будет дросселирования?

В моей ситуации у меня есть виджет, который обновляется не чаще, чем каждые 30 минут. С предоставленными соответствующими разрешениями на местоположение (передний план и фон) я уже могу получить доступ к последнему известному местоположению, используя FusedLocationProviderClient.getLastLocation(), и это работает нормально.

Но я хотел бы изучить более активный подход, используя getCurrentLocation() вместо getLastLocation(). Для виджета без приложения на переднем плане, даже переходя от LocationRequest.PRIORITY_HIGH_ACCURACY к getCurrentLocation(), я никогда не вижу маленького значка местоположения (значка булавки карты), появляющегося в строке состояния, как я ожидал бы, если бы устройство активно запрашивало новое местоположение исправить. Да, разрешение ACCESS_FINE_LOCATION запрашивается и предоставляется. Используя тот же вызов метода в приложении (на переднем плане), я действительно вижу значок местоположения.

Итак, есть ли реальная польза для виджета в использовании getCurrentLocation() вместо getLastLocation() в фоновом режиме, если он каким-то образом будет значительно затруднен? Иногда кажется, что для завершения требуется около 30 секунд (без видимого знака в строке состояния любого доступа к местоположению), а затем все равно возвращается с местоположением null, так что же он на самом деле делает?

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

Так что же такое дросселирование? Просто установить ограничение на частоту (виджет обновляется не чаще, чем каждые 30 минут, так что это вряд ли часто)? Или установить ограничение на точность (например, без GPS)?




Ответы (1)


Я думаю, что это, вероятно, связано с этими ограничениями местоположения в фоновом режиме:

Чтобы снизить энергопотребление, Android 8.0 (уровень API 26) ограничивает частоту получения приложением информации о текущем местоположении пользователя, когда оно работает в фоновом режиме. В этих условиях приложения могут получать обновления местоположения только несколько раз в час.

person drmrbrewer    schedule 13.02.2021