Используя API определения местоположения сервисов Google Play, ваше приложение может запрашивать последнее известное местоположение устройства пользователя. В большинстве случаев вас интересует текущее местоположение пользователя, которое обычно совпадает с последним известным местоположением устройства.
В частности, используйте поставщик объединённого местоположения для получения последнего известного местоположения устройства. Поставщик объединённого местоположения — это один из API определения местоположения в сервисах Google Play. Он управляет базовой технологией определения местоположения и предоставляет простой API, позволяющий задавать требования высокого уровня, например, высокую точность или низкое энергопотребление. Он также оптимизирует расход заряда аккумулятора устройства.
Примечание: Когда ваше приложение работает в фоновом режиме, доступ к местоположению должен быть критически важным для основных функций приложения и сопровождаться надлежащим раскрытием информации пользователям.
В этом уроке показано, как сделать один запрос на местоположение устройства с помощью метода getLastLocation() в поставщике объединенного местоположения.
Настройка сервисов Google Play
Для доступа к поставщику объединённого местоположения проект разработки вашего приложения должен включать сервисы Google Play. Загрузите и установите компонент сервисов Google Play через SDK Manager и добавьте библиотеку в свой проект. Подробнее см. в руководстве по настройке сервисов Google Play .
Укажите разрешения приложения
Приложения, функции которых используют службы определения местоположения, должны запрашивать разрешения на определение местоположения в зависимости от вариантов использования этих функций.
Создать клиент служб определения местоположения
В методе onCreate() вашей активности создайте экземпляр Fused Location Provider Client, как показано в следующем фрагменте кода.
Котлин
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); }
Получить последнее известное местоположение
После создания клиента служб определения местоположения вы можете получить последнее известное местоположение устройства пользователя. Когда ваше приложение подключено к этим службам, вы можете использовать метод getLastLocation() поставщика объединённого местоположения для получения местоположения устройства. Точность местоположения, возвращаемого этим вызовом, определяется настройками разрешений, указанными в манифесте приложения, как описано в руководстве по запросу разрешений на определение местоположения .
Чтобы запросить последнее известное местоположение, вызовите метод 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 можно найти в следующих материалах:
Образцы
- Пример приложения для демонстрации передового опыта при получении текущего местоположения.