Получить последнее известное местоположение

Используя API определения местоположения сервисов Google Play, ваше приложение может запрашивать последнее известное местоположение устройства пользователя. В большинстве случаев вас интересует текущее местоположение пользователя, которое обычно соответствует последнему известному местоположению устройства.

В частности, используйте поставщика объединенного местоположения , чтобы получить последнее известное местоположение устройства. Поставщик объединенного местоположения — это один из API определения местоположения в сервисах Google Play. Он управляет базовой технологией определения местоположения и предоставляет простой API, позволяющий указать требования на высоком уровне, такие как высокая точность или низкое энергопотребление. Это также оптимизирует использование заряда аккумулятора устройством.

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

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

Настройте сервисы Google Play

Чтобы получить доступ к поставщику объединенного местоположения, проект разработки вашего приложения должен включать сервисы Google Play. Загрузите и установите компонент сервисов Google Play через SDK Manager и добавьте библиотеку в свой проект. Подробности см. в руководстве по настройке сервисов Google Play .

Укажите разрешения приложения

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

Создание клиента служб определения местоположения

В методе onCreate() вашего действия создайте экземпляр клиента Fused Location Provider, как показано в следующем фрагменте кода.

Котлин

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Ява

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

Получить последнее известное местоположение

После создания клиента служб определения местоположения вы можете получить последнее известное местоположение устройства пользователя. Когда ваше приложение подключено к ним, вы можете использовать метод getLastLocation() поставщика объединенного местоположения для получения местоположения устройства. Точность местоположения, возвращаемого этим вызовом, определяется настройкой разрешения, которую вы указали в манифесте приложения, как описано в руководстве о том, как запросить разрешения на местоположение .

Чтобы запросить последнее известное местоположение, вызовите метод getLastLocation() . Следующий фрагмент кода иллюстрирует запрос и простую обработку ответа:

Котлин

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

Ява

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

Метод getLastLocation() возвращает Task , который можно использовать для получения объекта Location с координатами широты и долготы географического местоположения. Объект местоположения может иметь null в следующих ситуациях:

  • Местоположение отключено в настройках устройства. Результат может быть null даже если последнее местоположение было получено ранее, поскольку отключение местоположения также очищает кеш.
  • Устройство никогда не записывало свое местоположение, что может быть в случае нового устройства или устройства, для которого были восстановлены заводские настройки.
  • Службы Google Play на устройстве перезапущены, и нет активного клиента Fused Location Provider, который запрашивал местоположение после перезапуска служб. Чтобы избежать этой ситуации, вы можете создать нового клиента и самостоятельно запрашивать обновления местоположения. Дополнительную информацию см. в разделе Получение обновлений местоположения .

Выберите лучшую оценку местоположения

FusedLocationProviderClient предоставляет несколько методов для получения информации о местоположении устройства. Выберите один из следующих вариантов в зависимости от варианта использования вашего приложения:

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

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

Дополнительные ресурсы

Для получения дополнительной информации о получении текущего местоположения в Android просмотрите следующие материалы:

Образцы