Location в Android Studio: настройка геолокации в эмуляторе и приложении

Когда приложение в эмуляторе Android Studio показывает нулевые координаты или null вместо местоположения, причина почти всегда одна: эмулятор не получил тестовую геопозицию, а разработчик ожидает, что она появится сама. В отличие от реального смартфона, у виртуального устройства нет GPS-модуля — координаты нужно задавать вручную через панель Extended Controls или командную строку.

В этой статье разберём, как эмулировать location в Android Studio, какие разрешения нужны приложению, как получать координаты через FusedLocationProviderClient и почему геолокация может не работать даже при правильном коде.

Как задать координаты в эмуляторе Android Studio

Самый простой способ передать тестовую геопозицию — встроенная панель эмулятора. Запустите виртуальное устройство, затем нажмите кнопку с тремя точками (More) на боковой панели эмулятора. Откроется окно Extended Controls, где первым пунктом идёт раздел Location.

В этом разделе доступны два режима: одиночная точка (Single points) и маршруты (Routes). Для одиночной точки введите широту и долготу в поля Latitude и Longitude, затем нажмите кнопку отправки координат. Эмулятор мгновенно «переместится» в указанную точку, и все приложения, запрашивающие геолокацию, получат новые данные.

Также поддерживается импорт файлов форматов GPX и KML — это удобно, когда нужно воспроизвести движение по маршруту, например для тестирования навигатора или фитнес-приложения.

Передача геолокации через командную строку

Если вы автоматизируете тесты, удобнее задавать координаты через adb или консоль эмулятора. Для этого используется подключение по telnet к порту эмулятора:

telnet localhost 5554

geo fix 37.421998 -122.084000

Первое число после geo fix — долгота, второе — широта. Обратите внимание: порядок аргументов здесь обратный по сравнению с привычной записью «широта, долгота», и это частая причина ошибок, когда точка оказывается в другом полушарии.

Порт эмулятора отображается в заголовке его окна (обычно 5554 для первого запущенного устройства). Если telnet-клиент не установлен в системе, в Windows его можно включить через компоненты ОС, а в Linux и macOS он доступен из пакетного менеджера.

⚠️ Внимание: команда geo fix задаёт координаты только для GPS-провайдера. Если приложение использует сетевое определение местоположения, результат может отличаться — проверяйте, какой провайдер задействован в вашем коде.

Разрешения на геолокацию в приложении

Без корректно объявленных разрешений любой запрос координат вернёт ошибку или null. В файле AndroidManifest.xml необходимо указать одно из двух разрешений — или оба:

  • 📍 ACCESS_FINE_LOCATION — точное местоположение по GPS;
  • 📡 ACCESS_COARSE_LOCATION — приблизительное, по сети и Wi-Fi;
  • 🌐 ACCESS_BACKGROUND_LOCATION — доступ в фоне (требуется отдельное обоснование при публикации).

Начиная с Android 6.0, разрешения на геолокацию запрашиваются в рантайме — одного объявления в манифесте недостаточно. Приложение должно вызвать системный диалог запроса и обработать отказ пользователя. В современных версиях Android пользователь может выдать только приблизительное местоположение, даже если запрошено точное — код должен корректно обрабатывать оба сценария.

📊 Как вы чаще всего тестируете геолокацию?
Extended Controls в эмуляторе
Команда geo fix через telnet
GPX/KML-маршруты
Реальное устройство

Получение координат через FusedLocationProviderClient

Рекомендуемый способ работы с location в Android-приложениях — API FusedLocationProviderClient из библиотеки Google Play Services. Он объединяет данные GPS, сети и датчиков, выбирая оптимальный источник по точности и энергопотреблению.

Зависимость подключается в файле build.gradle модуля приложения:

implementation "com.google.android.gms:play-services-location:21.0.1"

Актуальную версию библиотеки стоит сверить с официальной документацией, так как номера обновляются. Базовый запрос последней известной позиции выглядит так:

val client = LocationServices.getFusedLocationProviderClient(this)

client.lastLocation.addOnSuccessListener { location: Location? ->

// location может быть null — обязательна проверка

}

Для непрерывного отслеживания используется метод requestLocationUpdates с объектом LocationRequest, где задаётся интервал обновлений и приоритет точности. Не забывайте отменять подписку в onPause или onDestroy, иначе приложение продолжит расходовать батарею в фоне.

Типичные проблемы и их диагностика

Разберём ситуации, с которыми чаще всего сталкиваются при работе с location в Android Studio. Сначала проверьте самое простое: включена ли геолокация в настройках самого эмулятора. Виртуальное устройство имеет собственный переключатель Location в шторке быстрых настроек, и по умолчанию он может быть выключен.

  • 🛰️ Координаты заданы в Extended Controls, но приложение видит старую точку — отправьте координаты повторно и проверьте, что запрос идёт после обновления;
  • 🔒 Запрос разрешения не появляется — проверьте, что разрешение объявлено в манифесте и не было ранее запрещено навсегда;
  • 📴 lastLocation возвращает null — эмулятор ещё не получал ни одной геопозиции, задайте точку вручную;
  • 🗺️ Точка оказалась не там — проверьте порядок широты и долготы в команде geo fix.
⚠️ Внимание: эмуляторы без образа Google Play не содержат Play Services, и FusedLocationProvider в них работать не будет. При создании AVD выбирайте образ с пометкой Google Play, если приложение зависит от этого API.

Сравнение способов задания геопозиции

Каждый метод эмуляции location подходит для своих задач. Сводная таблица поможет выбрать подходящий вариант:

СпособСценарий использованияОграничения
Extended ControlsРучное тестирование, одиночные точкиТребует действий в GUI
Команда geo fixАвтотесты, скрипты, CIТолько GPS-провайдер
Импорт GPX/KMLМаршруты и движениеНужен подготовленный файл
Реальное устройствоФинальная проверка точностиЗависит от реального сигнала

Для полноценного покрытия тестами разумно комбинировать подходы: разработку вести на эмуляторе с Extended Controls, регрессионные проверки гонять через geo fix, а финальную валидацию точности выполнять на физическом смартфоне.

☑️ Проверка перед отладкой геолокации

Выполнено: 0 / 5

Тестирование маршрутов и движения

Одиночная точка не проверяет логику приложения в движении. Для таких сценариев в Extended Controls предусмотрена вкладка Routes: загрузите GPX-файл с набором точек, выберите скорость воспроизведения и запустите проигрывание. Эмулятор начнёт последовательно передавать координаты, имитируя перемещение.

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

Формат GPX-точки

Каждая точка маршрута описывается элементом trkpt с атрибутами lat и lon, например: trkpt lat="55.751244" lon="37.618423". Точки группируются внутри элемента trkseg, а весь маршрут — внутри trk.

Часто задаваемые вопросы

Почему эмулятор показывает местоположение в Калифорнии?

Многие образы AVD имеют координаты по умолчанию, соответствующие кампусу Google. Это нормальное поведение — просто задайте свою тестовую точку через Extended Controls или команду geo fix.

Работает ли FusedLocationProvider на любом эмуляторе?

Нет, требуется образ AVD с Google Play. Образы с пометкой Google APIs содержат часть сервисов, но для гарантированной работы выбирайте вариант с Google Play при создании виртуального устройства.

Чем отличается ACCESS_FINE_LOCATION от ACCESS_COARSE_LOCATION?

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

Можно ли тестировать геолокацию без эмулятора?

Да, на реальном устройстве можно включить режим разработчика и использовать приложения для подмены местоположения (mock location). Однако для автоматизированных тестов эмулятор удобнее, так как координаты задаются программно.

Почему lastLocation возвращает null даже с разрешениями?

Метод возвращает последнюю зафиксированную системой позицию, а её может ещё не существовать — например, сразу после запуска эмулятора. Задайте тестовую точку или используйте requestLocationUpdates для активного получения координат.