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

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

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

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

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

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

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

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

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

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

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

Котлин

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);
}

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

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

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

Котлин

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 на устройстве перезапустились, и после перезапуска сервисов нет активного клиента Fused Location Provider, который запрашивал бы данные о местоположении. Чтобы избежать этой ситуации, вы можете создать новый клиент и самостоятельно запрашивать обновления местоположения. Дополнительную информацию см. в разделе «Запрос обновлений местоположения» .

Выберите наиболее подходящую оценку местоположения.

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

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

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

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

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

Образцы

  • Пример приложения , демонстрирующий лучшие практики при получении текущего местоположения.