Обновления фонового местоположения с использованием API Google - поставщик надежного местоположения неточный

Я работал и тестировал обновления фона, используя GoogleApiClient для обновлений на основе Interval и Displacement. При тестировании и анализе в течение нескольких дней я выяснил некоторые изменения в выходе, которых я не ожидал.

  • При использовании setInterval и setFastestInterval для обновлений на основе интервала, скажем, я установил Интервал как 15 минут и Самый быстрый интервал как 10 минут, 90% времени я получаю обновления ожидаемого интервала (от 10 до 15 минут). Но иногда я заметил, что обновления занимают гораздо больше времени, чем указанный интервал, например, разница составляет около 30 минут и 60 минут. Любая идея о том, почему разница?

  • При использовании setMinimumDisplacement для обновлений на основе расстояния, скажем, я установил Смещение как 200 метров, я получаю обновления только в стационарных точках (Пока путешествие по нему не дает обновлений, даже если оно превышает 200 метров), которые составляют 200 метров и выше. Это как обычно работает?

Я использую PendingIntent тип запросов местоположения для получения обновлений местоположения в BroadcastReceiver для обновлений местоположения в фоновом режиме.

fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);

При тестировании Услуги определения местоположения были ВКЛ и Режим расположения был HIGH_ACCURACY.

Ответ 1

Пожалуйста, обратитесь к документации, чтобы получить правильное поведение API LocationRequest.

LocationRequest Документация Api

Из этой документации:

  • Приложения не могут указывать точные источники местоположения, такие как GPS, которые используются LocationClient. Фактически, система может иметь несколько источников местонахождения (поставщиков) и может свести результаты из нескольких источников в один объект местоположения
  • Запросы местоположения от приложений с ACCESS_COARSE_LOCATION, а не ACCESS_FINE_LOCATION будут автоматически уменьшаться до более медленного интервала, а объект местоположения будет запутан, чтобы показывать только грубый уровень точности.
  • Все запросы на местоположение считаются подсказками, и вы можете получать более/менее точные адреса и быстрее/медленнее, чем запрашивалось

Для более подробного описания прочитайте полную документацию по ссылке выше.

Надеюсь, что это объяснение поможет вам.

Ответ 2

Я нашел ответ на свой второй вопрос. Документация говорит, что не рекомендуется setMinimumDisplacement в 0, но это фактический трюк. Он работает, как ожидалось, когда он установлен в 0.

Он работает правильно при наличии двух разных LocationRequest (на основе интервала и смещения), так что один параметр не влияет на другой.

Служба Foreground Service предпочтительнее для вышеупомянутого сценария, чтобы обновления местоположения не убивались ОС.