Работаем с GPS в Android на Java

Мобильные устройства часто используются для решения различных задач связанных с определением географических координат. Транспорт, строительство, путешественники, так или иначе, нуждаются в определении своего местоположения или других объектов.

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

В Android SDK весь функционал  по работе с навигационными системами объединён в пакет android.location. Ключевые компоненты данного пакета:

  • LocationManager – (класс) обеспечивает доступ к системной службе определения местоположения Android;
  • LocationListener — (интерфейс) регламентирует обработку приложение событий службы определения местоположения Android;
  • Location – (класс) представляет географические координаты полученные от навигационной системы.
Подготовка к работе

При написании Android приложения работающего с навигационными системами на Java с помощью Android SDK вначале необходимо выполнить ряд подготовительных операций.

Это связано с тем, что в отличие от Delphi, здесь отсутствуют какие-либо разрешения, предоставляемые по умолчанию и нет готовых компонентов, которые полностью брали бы на себя всю работу по взаимодействию с GPS приёмником.

Все необходимые действия потребуется выполнить самостоятельно.

Первым делом предоставляем приложению необходимые разрешения в файле манифеста.

Далее создаём в коде приложения объект LocationListener для обработки событий службы определения местоположения Android.

Назначение его методов – обработка соответствующих событий. Конкретно:

  • onLocationChanged – изменение местоположения. Именно он используется для определения текущих географических координат;
  • onStatusChanged – изменение состояния поставщика данных о местоположении. В частности приёмника GPS;
  • onProviderEnabled – получение доступа к поставщику данных о местоположении;
  • onProviderDisabled – потеря доступа к поставщику данных о местоположении.

В завершение зарегистрируем созданный нами объект LocationListener для работы с приёмником GPS.

Для этого создаём экземпляр класса LocationManager.

И выполняем регистрацию при помощи метода requestLocationUpdates.

Перед вызовом метода requestLocationUpdates обязательно необходимо проверить наличие соответствующих разрешений (оператор if). Если они отсутствуют перед оператором return можно выполнить некоторые действия. Например, записать сообщение об ошибке в журнал. Однако в любом случае при отсутствии необходимых разрешений работа с навигационной системой должна быть завершена до регистрации объекта LocationListener.

Метод requestLocationUpdates имеет несколько перегрузок. Наиболее часто используемая из них принимает четыре параметра. Именно она использована в примере выше.

  1. Поставщик данных о местоположении.
    В данном примере используется GPS;
  2. Минимальный интервал обновления данных о местоположения в миллисекундах.
    Значение «0» соответствует использованию минимально возможного интервала времени для данного устройства;
  3. Минимальное расстояние для обновления данных о местоположении в метрах.
    Значение «0» соответствует использованию минимально возможного расстояния для данного устройства;
  4. Регистрируемый объект LocationListener.

После регистрации приложение сможет получать информацию о местоположении устройства по мере его изменения.

Если необходимо получить её единовременно, необходимо вместо метода requestLocationUpdates использовать метод requestSingleUpdate, который также имеет несколько перегрузок.

Наиболее востребованная из них принимает три параметра:

  1. Поставщик данных о местоположении.
    В данном примере используется GPS;
  2. Регистрируемый объект LocationListener;
  3. Объект, реализующий обратный вызов.
    Необязательный параметр.

Пример использования метода requestSingleUpdate:

Получение географических координат

Получение географических координат от GPS приёмника возможно в событии onLocationChanged объекта LocationListener после его регистрации.

Ниже приведён пример вывода значений текущих широты и долготы на экран устройства в два элемента TextView.

Если местоположение определить не удалось (location == null), то в этих же элементах будет показано соответствующее сообщение.

Значения географических координат возвращаются в десятичном представлении. Поэтому для отображения в «обычном» формате (градусы-минуты-секунды) необходима дополнительная обработка.

2 комментария

  1. Похоже это современный пример. Интернет пестрит старьем. Спасибо.
    Но почему-то не работает в сервисе внутри таймера.

    1. Спасибо.

      Всегда пожалуйста!

      Но почему-то не работает в сервисе внутри таймера.

      В статье показан в первую очередь принцип работы с GPS в Android. Этот принцип на самом деле един и для Acivity (на примере которого он показан в действии) и для Service. Вероятно что-то не учли или где-нибудь ошиблись.
      Кроме того, как я уже писал выше, некоторые примеры в статье приведены для Activity. Поэтому если код был скопирован Вами «в лоб» без доработки с учётом специфики Service, естественно, что он работать не будет

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *