Используя API местоположения сервисов Google Play, ваше приложение может запрашивать последнее известное местоположение устройства пользователя. В большинстве случаев вас интересует текущее местоположение пользователя, которое обычно эквивалентно последнему известному местоположению устройства.
В частности, используйте поставщика fusion location для получения последнего известного местоположения устройства. Поставщик fusion location — это один из API определения местоположения в сервисах Google Play. Он управляет базовой технологией определения местоположения и предоставляет простой API, чтобы вы могли указывать требования на высоком уровне, например, высокую точность или низкое энергопотребление. Он также оптимизирует использование заряда батареи устройством.
Примечание: Когда ваше приложение работает в фоновом режиме, доступ к местоположению должен иметь решающее значение для основных функций приложения и сопровождаться надлежащим раскрытием информации пользователям.
В этом уроке показано, как сделать одиночный запрос местоположения устройства с помощью метода getLastLocation()
в поставщике объединенного местоположения.
Настройка сервисов Google Play
Для доступа к поставщику Fused Location проект разработки вашего приложения должен включать сервисы 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); }
Получить последнее известное местоположение
После создания клиента Location Services вы можете получить последнее известное местоположение устройства пользователя. Когда ваше приложение подключено к ним, вы можете использовать метод getLastLocation()
поставщика Fused Location для получения местоположения устройства. Точность местоположения, возвращаемого этим вызовом, определяется настройкой разрешения, которую вы указали в манифесте своего приложения, как описано в руководстве по запросу разрешений на местоположение .
Чтобы запросить последнее известное местоположение, вызовите метод 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
с координатами широты и долготы географического местоположения. Объект location может быть null
в следующих ситуациях:
- Местоположение отключено в настройках устройства. Результат может быть
null
даже если последнее местоположение было ранее получено, поскольку отключение местоположения также очищает кэш. - Устройство не записало свое местоположение, что может быть характерно для нового устройства или для устройства, на котором были восстановлены заводские настройки.
- Службы Google Play на устройстве перезапущены, и нет активного клиента Fused Location Provider, который запросил местоположение после перезапуска служб. Чтобы избежать этой ситуации, вы можете создать нового клиента и самостоятельно запросить обновления местоположения. Для получения дополнительной информации см. Запрос обновлений местоположения .
Выберите лучшую оценку местоположения
FusedLocationProviderClient
предоставляет несколько методов для получения информации о местоположении устройства. Выберите один из следующих методов в зависимости от варианта использования вашего приложения:
-
getLastLocation()
быстрее получает оценку местоположения и минимизирует использование батареи, которое может быть отнесено к вашему приложению. Однако информация о местоположении может быть устаревшей, если другие клиенты не использовали местоположение активно в последнее время. getCurrentLocation()
получает более свежее, более точное местоположение более последовательно. Однако этот метод может привести к активному вычислению местоположения на устройствеЭто рекомендуемый способ получения свежего местоположения, когда это возможно, и он безопаснее альтернатив, таких как запуск и управление обновлениями местоположения самостоятельно с помощью
requestLocationUpdates()
. Если ваше приложение вызываетrequestLocationUpdates()
, оно может иногда потреблять большое количество энергии, если местоположение недоступно или если запрос не был правильно остановлен после получения нового местоположения.
Дополнительные ресурсы
Дополнительную информацию о получении текущего местоположения в Android можно найти в следующих материалах:
Образцы
- Пример приложения для демонстрации передового опыта при получении текущего местоположения.