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

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

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

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

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

Как настроить сервисы Google Play

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

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

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

Создать клиента сервисов геолокации

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

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

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

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

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

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

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

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

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

Kotlin

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

Java

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 с координатами широты и долготы географического местоположения. Объект location может иметь значение null в следующих случаях:

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

Выберите наиболее точное местоположение

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

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

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

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

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

Образцы