Когда приложение в эмуляторе 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 пользователь может выдать только приблизительное местоположение, даже если запрошено точное — код должен корректно обрабатывать оба сценария.
Получение координат через 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, а финальную валидацию точности выполнять на физическом смартфоне.
☑️ Проверка перед отладкой геолокации
Тестирование маршрутов и движения
Одиночная точка не проверяет логику приложения в движении. Для таких сценариев в 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 для активного получения координат.