С помощью 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 можно найти в следующих материалах:
Образцы
- Пример приложения, демонстрирующий рекомендации по получению текущего местоположения.