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