Мобильные устройства часто используются для решения различных задач связанных с определением географических координат. Транспорт, строительство, путешественники, так или иначе, нуждаются в определении своего местоположения или других объектов.
На сегодняшний день самым простым решением для этого является использование портативных приёмников спутниковых навигационных систем, в частности встраиваемых в устройства на базе Android. При этом наиболее распространёнными являются устройства с поддержкой системы GPS.
В Android SDK весь функционал по работе с навигационными системами объединён в пакет android.location. Ключевые компоненты данного пакета:
- LocationManager – (класс) обеспечивает доступ к системной службе определения местоположения Android;
- LocationListener — (интерфейс) регламентирует обработку приложение событий службы определения местоположения Android;
- Location – (класс) представляет географические координаты полученные от навигационной системы.
Подготовка к работе
При написании Android приложения работающего с навигационными системами на Java с помощью Android SDK вначале необходимо выполнить ряд подготовительных операций.
Это связано с тем, что в отличие от Delphi, здесь отсутствуют какие-либо разрешения, предоставляемые по умолчанию и нет готовых компонентов, которые полностью брали бы на себя всю работу по взаимодействию с GPS приёмником.
Все необходимые действия потребуется выполнить самостоятельно.
Первым делом предоставляем приложению необходимые разрешения в файле манифеста.
1 |
Далее создаём в коде приложения объект LocationListener для обработки событий службы определения местоположения Android.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private LocationListener listener = new LocationListener() { @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; |
Назначение его методов – обработка соответствующих событий. Конкретно:
- onLocationChanged – изменение местоположения. Именно он используется для определения текущих географических координат;
- onStatusChanged – изменение состояния поставщика данных о местоположении. В частности приёмника GPS;
- onProviderEnabled – получение доступа к поставщику данных о местоположении;
- onProviderDisabled – потеря доступа к поставщику данных о местоположении.
В завершение зарегистрируем созданный нами объект LocationListener для работы с приёмником GPS.
Для этого создаём экземпляр класса LocationManager.
1 |
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); |
И выполняем регистрацию при помощи метода requestLocationUpdates.
1 2 3 4 5 6 |
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Проверка наличия разрешений // Если нет разрешения на использование соответсвующих разркешений выполняем какие-то действия return; } manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,listener); |
Перед вызовом метода requestLocationUpdates обязательно необходимо проверить наличие соответствующих разрешений (оператор if). Если они отсутствуют перед оператором return можно выполнить некоторые действия. Например, записать сообщение об ошибке в журнал. Однако в любом случае при отсутствии необходимых разрешений работа с навигационной системой должна быть завершена до регистрации объекта LocationListener.
Метод requestLocationUpdates имеет несколько перегрузок. Наиболее часто используемая из них принимает четыре параметра. Именно она использована в примере выше.
- Поставщик данных о местоположении.
В данном примере используется GPS; - Минимальный интервал обновления данных о местоположения в миллисекундах.
Значение «0» соответствует использованию минимально возможного интервала времени для данного устройства; - Минимальное расстояние для обновления данных о местоположении в метрах.
Значение «0» соответствует использованию минимально возможного расстояния для данного устройства; - Регистрируемый объект LocationListener.
После регистрации приложение сможет получать информацию о местоположении устройства по мере его изменения.
Если необходимо получить её единовременно, необходимо вместо метода requestLocationUpdates использовать метод requestSingleUpdate, который также имеет несколько перегрузок.
Наиболее востребованная из них принимает три параметра:
- Поставщик данных о местоположении.
В данном примере используется GPS; - Регистрируемый объект LocationListener;
- Объект, реализующий обратный вызов.
Необязательный параметр.
Пример использования метода requestSingleUpdate:
1 |
manager.requestSingleUpdate (LocationManager.GPS_PROVIDER, listener, null); |
Получение географических координат
Получение географических координат от GPS приёмника возможно в событии onLocationChanged объекта LocationListener после его регистрации.
Ниже приведён пример вывода значений текущих широты и долготы на экран устройства в два элемента TextView.
1 2 3 4 5 6 7 8 9 10 |
public void onLocationChanged(Location location) { if (location!=null) { lathitude.setText(String.valueOf(location.getLatitude())); longitude.setText(String.valueOf(location.getLongitude())); } else{ lathitude.setText("Sorry, location"); longitude.setText("unavailable"); } } |
Если местоположение определить не удалось (location == null), то в этих же элементах будет показано соответствующее сообщение.
Значения географических координат возвращаются в десятичном представлении. Поэтому для отображения в «обычном» формате (градусы-минуты-секунды) необходима дополнительная обработка.
Похоже это современный пример. Интернет пестрит старьем. Спасибо. Но почему-то не работает в сервисе внутри таймера.
Спасибо. Всегда пожалуйста! Но почему-то не работает в сервисе внутри таймера. В статье показан в первую очередь принцип работы с GPS в Android. Этот принцип на самом деле един и для Acivity (на примере которого он показан в действии) и для Service. Вероятно что-то не учли или где-нибудь ошиблись. Кроме того, как я уже писал выше, некоторые примеры в статье приведены для Activity. Поэтому если код был скопирован Вами «в лоб» без доработки с учётом специфики Service, естественно, что он работать не будет