Gps api android что это

Полный список

— получаем данные о местоположении

Android устройства могут предоставить нам данные по нашему текущему местоположению. Это, конечно, очень удобно и вовсю используется для, например, пользования картой, получения актуальной для вашей местности информации (прогноз погоды), всевозможных чекинов и пр.

Реализация этого всего вполне проста. Мы вешаем слушателя на провайдера и получаем данные. На данный момент есть два провайдера: GPS и Network.

GPS – тут все понятно, это данные с GPS-спутников.

Network – это координаты, которые можно получить через сотовую связь или WiFi. Для этого провайдера нужен инет.

Напишем простое приложение, которое будет запрашивать и отображать координаты.

Project name: P1381_Location
Build Target: Android 2.3.3
Application name: Location
Package name: ru.startandroid.develop.p1381location
Create Activity: MainActivity

В strings.xml добавим строки:

Несколько TextView, в которые мы будем выводить данные, и кнопка для открытия настроек местоположения.

В onCreate определяем TextView-компоненты и получаем LocationManager, через который и будем работать.

В onResume вешаем слушателя с помощью метода requestLocationUpdates. На вход передаем:

— тип провайдера: GPS_PROVIDER или NETWORK_PROVIDER
— минимальное время (в миллисекундах) между получением данных. Я укажу здесь 10 секунд, мне этого вполне хватит. Если хотите получать координаты без задержек – передавайте 0. Но учитывайте, что это только минимальное время. Реальное ожидание может быть дольше.
— минимальное расстояние (в метрах). Т.е. если ваше местоположение изменилось на указанное кол-во метров, то вам придут новые координаты.
— слушатель, объект locationListener, который рассмотрим ниже

Также здесь обновляем на экране инфу о включенности провайдеров.

В onPause отключаем слушателя методом removeUpdates.

locationListener – слушатель, реализует интерфейс LocationListener с методами:

onLocationChanged – новые данные о местоположении, объект Location. Здесь мы вызываем свой метод showLocation, который на экране отобразит данные о местоположении.

onProviderDisabled – указанный провайдер был отключен юзером. В этом методе вызываем свой метод checkEnabled, который на экране обновит текущие статусы провайдеров.

onProviderEnabled – указанный провайдер был включен юзером. Тут также вызываем checkEnabled. Далее методом getLastKnownLocation (он может вернуть null) запрашиваем последнее доступное местоположение от включенного провайдера и отображаем его. Оно может быть вполне актуальным, если вы до этого использовали какое-либо приложение с определением местоположения.

onStatusChanged – изменился статус указанного провайдера. В поле status могут быть значения OUT_OF_SERVICE (данные будут недоступны долгое время), TEMPORARILY_UNAVAILABLE (данные временно недоступны), AVAILABLE (все ок, данные доступны). В этом методе мы просто выводим новый статус на экран.

Провайдеры включаются и отключаются в настройках системы. Тем самым, просто определяется доступен ли провайдер для получения от него координат. Чуть позже увидим, как можно отправить юзера в эти настройки. Программное включение/выключение провайдеров через стандартные методы недоступно.

Далее идут свои методы.

showLocation на вход берет Location, определяет его провайдера методом getProvider и отображает координаты в соответствующем текстовом поле.

formatLocation на вход берет Location, читает из него данные и форматирует из них строку. Какие данные он берет: getLatitude – широта, getLongitude – долгота, getTime – время определения.

checkEnabled определяет включены или выключены провайдеры методом isProviderEnabled и отображает эту инфу на экране.

Метод onClickLocationSettings срабатывает по нажатию кнопки Location settings и открывает настройки, чтобы пользователь мог включить или выключить провайдер. Для этого используется Intent с action = ACTION_LOCATION_SOURCE_SETTINGS.

Осталось в манифесте прописать разрешение на определение координат — ACCESS_FINE_LOCATION, которое позволит нам использовать и Network и GPS. Также существует разрешение ACCESS_COARSE_LOCATION, но оно дает доступ только к Network-провайдеру.

С кодом все, давайте смотреть, что получилось. Все сохраняем и запускаем приложение.

У меня на планшете сейчас выключен GPS, выключен WiFi, вставлена симка и выключен мобильный интернет.

Запускаю приложение и вижу такую картину:

GPS выключен, Network включен. Но инета нет, поэтому Network мне ничего не дает. Надо включить либо мобильный инет, либо WiFi.

Я включаю WiFi. Проходит секунд 15-20 и инфа с Network пошла

Видим широту, долготу и время.

Напомню, что мы ставили минимальную скорость обновления – 10 сек. Но у меня провайдер Network выдает данные не чаще, чем раз в минуту.

Теперь давайте включим GPS. Для этого мы специально повесили кнопку Location settings, которую надо будет нажать пользователю, чтобы перейти в настройки. Жмем кнопку.

Читайте также:  Aimp не воспроизводит m4a android

Видим, что GPS выключен, а Network включен. Наше приложение показывало все верно.

Разумеется, GPS можно включать и выключать через быстрые настройки системы (справа сверху). Но не все пользователи об этом знают. А тут мы их точно направим.

Включаем GPS и жмем Назад, чтобы вернуться в приложение.

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

В итоге сигнал пойман и получен результат.

У GPS через какое-то время включился статус 2 (AVAILABLE).

А у Network тишина со статусом. Не знаю, нормально это или нет.

Если с GPS сигналом все ок, то каждые 10 сек вы будете получать инфу о вашем местоположении. Если убрать планшет от окна, получим плохой сигнал: данные могут приходить реже и статус у меня иногда меняется на 1 (TEMPORARILY_UNAVAILABLE).

Прочее

Есть еще третий тип провайдера — PASSIVE_PROVIDER. Сам по себе этот провайдер никакие данные не вернет. Но повесив на него слушателя, вы сможете получать данные о местоположении, когда кто-то еще в системе пытается определить местоположение через обычные провайдеры. Система будет дублировать результаты и вам.

Метод getAllProviders вернет вам список всех доступных провайдеров. Метод getProviders(boolean enabledOnly) вернет либо все, либо только включенные.

Объект Location кроме координат, времени и провайдера имеет еще несколько атрибутов, которые могут прийти и пустыми:

getAccuracy – точность показания в метрах

getAltitude – высота над уровнем моря в метрах

getSpeed – скорость движения в м/с

getBearing – насколько я понял, это угол, на который текущая траектория движения отклоняется от траектории на север. Он же азимут.

Местоположение можно протестировать и через AVD эмулятор. Для этого надо в Eclipse открыть DDMS (Window > Open Perspective > DDMS) и выбрать вкладку Emulator Control. Внизу будет вкладка Manual, на которой есть поля для ввода координат и кнопка отправки.

На следующем уроке:

— создаем приложение с картой
— настраиваем карту и обрабатываем ее события
— программно меняем положение камеры

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Простой способ добавить геолокацию в свой проект для Android

Долго я прочёсывал интернет в поисках простого решения, как мне в проект добавить 1 только класс и больше не беспокоиться о проблемах геолокации.
Критерии были такие:
1) решить всё в 1 классе, как можно меньше используя внешний код.
2) у пользователя должна быть всегда под рукой 1 static переменная в которой указанно его местоположение и больше ни о чём он знать не должен.

Большинство постов не отвечало на поставленный вопрос: конечно сначала нужно обратиться к сервису, потом нужно установить listner, потом вы можете посмотреть на трёхстраничный краткий пример как это делать.
В итоге я написал свой класс, с которым и хочу вас познакомить: он прост в использовании и с ним сможет справиться любой: просто добавьте его в проект и будет вам счастье.

Итак, что же здесь есть?

Класс разделен на 3 части:
1) imHere — переменная типа Location, в которой будет всегда доступна самая последняя информация о местоположении пользователя.
2) функция SetUpLocationListener — в любом случае нам нужна будет начальная установка для того, чтобы система начала сама без нашего участия выполнять обновление переменной imHere.
3) все остальные обязательные части LocationListener, которые можно переделать по собственному желанию.

Итак, как это работает?

1) создаем класс MyLocationListener
2) копируем в него код написанный выше
3) в основной функции (например MainActivity) ближе к началу запускаем:

или для любителей потоков

4) теперь у нас всегда и в любой части нашего проекта есть переменная MyLocationListener.imHere типа Location, в которой хранится самое последнее местоположение пользователя и множество дополнительной информации, как например скорость или точность определения местоположения.

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

Читайте также:  Kantai collection для андроида

(!) Не забудьте: в зависимости от выбранного провайдера нужно добавить в манифест соответствующее разрешение. Например используемый выше GPS_PROVIDER требует добавления следующей строчки в манифест:

Источник

Введение в API геолокации

Введение

Уже много лет бумажные карты стали антикварными. Они были заменены специальными GPS-навигационными устройствами и мобильными приложениями, которые стали повсеместными. Вы находите их в автомобилях и, что более важно, на планшетах и смартфонах.

Одной из основных особенностей навигационного устройства является обнаружение текущего положения устройства и его обновление при его изменении. Это помогает нам добраться из одного места в другое, давая нам указания.

Сегодня нам повезло, что геолокация поддерживается браузерами. В этой статье мы обсудим API геолокации, позволяя приложениям обнаруживать и отслеживать местоположение устройства.

Возможность обнаружения местоположения устройства имеет широкий спектр приложений. Например, в Интернете Google, Microsoft и Yahoo используют местоположение пользователя для персонализации SERPs (Страница результатов поисковой системы) на основе местоположения пользователя. Локализация — еще одна отличная возможность для геолокации.

1. Что это такое?

API геолокации определяет интерфейс высокого уровня для информации о местоположении, такой как широта и долгота, которая связана с устройством, реализующим геолокацию. Сам API является не привязан к источникам информации о местоположении.

Общие источники информации о местоположении включают в себя Глобальную систему определения местоположения (GPS) и информацию о местоположении, выведенную из сетевых сигналов, таких как IP-адрес устройства, RFID, Wi-Fi, Bluetooth, MAC-адреса, идентификаторы сотовой сети GSM / CDMA и пользовательский ввод. Не предоставляется никаких гарантий, что API возвращает фактическое местоположение устройства.

API геолокации является Рекомендацией W3C, которая означает, что спецификация является стабильной. Мы можем предположить, что оно не изменится в будущем, если не будет работать новая версия. Стоит отметить, что API геолокации не является официально частью спецификации HTML5, поскольку он разработан отдельно.

Теперь, когда мы знаем, что такое API геолокации и что он может сделать, пришло время посмотреть, какие методы он предоставляет разработчикам.

2. Внедрение

Точность

API использует несколько источников для определения позиции устройства. Например, на ноутбуке или настольном компьютере без чипа GPS вполне вероятно, что позиция выводится из IP-адреса устройства, а это означает, что местоположение, возвращаемое API, не очень точное.

Однако на мобильном устройстве API может использовать информацию из нескольких и более точных источников, таких как чип GPS устройства, сетевое соединение (Wi-Fi, 3G, HSPA +) и ячейка GSM / CDMA. Вы можете ожидать более точной информации о местоположении на мобильном устройстве, особенно если GPS включен.

Конфиденциальность

Спецификация API геолокации также обсуждает конфиденциальность и разрешения. Фактически, в спецификации четко указано, что разрешение пользователя должно быть явно получено до включения API.

Это означает, что браузер должен отображать уведомление пользователю, запрашивающему их разрешение. Пример сообщения, показанного пользователю, показан ниже (Карты Google).

API предоставляет три метода, которые относятся к объекту window.navigator.geolocation . Предоставляемые методы:

  • getCurrentPosition
  • watchPosition
  • clearWatch

Обнаружение поддержки

Поиск устройства

Чтобы определить местоположение устройства, мы вызываем getCurrentPosition или watchPosition , в зависимости от ваших потребностей. Оба метода выполняют одну и ту же задачу с несколькими незначительными отличиями.

Чтобы получить местоположение устройства, getCurrentPosition и watchPosition делают асинхронный запрос. Разница между этими методами заключается в том, что getCurrentPosition выполняет одноразовый запрос, а watchPosition контролирует местоположение устройства для изменений и уведомляет приложение о том, когда происходит изменение местоположения.

API геолокации достаточно умен, чтобы вызвать только обратный вызов функции watchPosition -invoked, когда позиция получена — если местоположение пользователя изменяется.

Другим важным различием между getCurrentPosition и watchPosition является возвращаемое значение каждого метода. Метод getCurrentPosition ничего не возвращает, в то время как watchPosition возвращает идентификатор, который может использоваться, чтобы остановить API от контроля местоположения устройства через функцию clearWatch .

Сигнатуры getCurrentPosition и watchPosition выглядят следующим образом:

Как показывают сигнатуры, каждая функция принимает три параметра. Требуется только первый аргумент — функция обратного вызова. Давайте подробнее рассмотрим каждый аргумент.

  1. successCallback : эта функция обратного вызова выполняется после успешного получения местоположения пользователя. Обратный вызов принимает объект position , который содержит информацию о местоположении устройства.
  2. errorCallback : обратный вызов ошибки выполняется при возникновении ошибки. Обратный вызов ошибки принимает объект error , содержащий информацию о типе возникшей ошибки.
  3. options : Объект options дает разработчику возможность настроить асинхронный запрос.

Взгляните на следующие фрагменты, чтобы узнать, как вы можете использовать getCurrentPosition и watchPosition для получения местоположения устройства.

Читайте также:  Темы для андроид реалми

Остановить мониторинг местоположения

В предыдущем разделе я упомянул функцию clearWatch . Эта функция позволяет остановить мониторинг местоположения устройства, инициированный вызовом watchPosition.

Функция clearWatch принимает один обязательный аргумент, возвращаемый нам идентификатор после вызова watchPosition .

Теперь, когда мы рассмотрели технические подробности API геолокации, пришло время изучить объекты position , error и options , возвращаемые API геолокации.

Информация о местонахождении

Position

Методы, представленные API геолокации, принимают или возвращают три типа объектов. Первым интересующим нас объектом является объект position , который содержит информацию о местоположении, которая нам интересна. Взгляните на следующую таблицу, чтобы получить представление о содержащейся в ней информации.

Объект позиции, который возвращается из обратных вызовов getCurrentPosition и watchPosition , содержит свойство timestamp и coords . Свойство coords — это объект, содержащий latitude , longitude , altitude , accuracy , altitudeAccuracy , heading , и speed .

Большинство настольных браузеров не вернут значение для свойств altitude , altitudeAccuracy , heading и speed . Однако мобильные устройства, такие как смартфоны и планшеты, обеспечивают более точную информацию благодаря наличию микросхемы GPS или другого оборудования, которое помогает обнаружить местоположение устройства.

Свойство timestamp содержит время обнаружения местоположения, которое может быть полезно, если вам нужно знать, как свежие данные были возвращены.

PositionError

Объект error обратного вызова ошибки, необязательный второй аргумент getCurrentPosition и watchPosition , имеет code и свойство message .

Свойство message кратко описывает тип ошибки. Свойство code может иметь одно из четырех значений:

  • 0 : запрос не выполнен, но причина неизвестна.
  • 1: запрос не удался, поскольку пользователь не дал разрешения на использование местоположения устройства.
  • 2 : запрос завершился неудачно в результате сетевой ошибки.
  • 3 : запрос завершился неудачно, поскольку для разрешения позиции устройства потребовалось слишком много времени.

PositionOptions

Необязательный третий аргумент getCurrentPosition и watchPosition — это объект PositionOptions , позволяющий разработчику настраивать асинхронный запрос.

В настоящее время объект PositionOptions поддерживает три варианта:

  • enableHighAccuracy : Если для значения установлено значение true , веб-страница или приложение указывают, что они хотят получить максимально возможный, самый точный результат. Это может привести к более медленному времени отклика или увеличению потребления энергии. Значение по умолчанию false .
  • timeout : Это свойство определяет максимальное количество миллисекунд, после которого запрос должен считаться устаревшим. По умолчанию используется значение Infinity .
  • maximumAge : Когда запрос местоположения будет успешным, браузер кэширует результат для последующего использования. Свойство maximumAge указывает время, в течение которого кеш должен быть недействительным. Значение по умолчанию равно 0 , что означает, что запрос не должен кэшироваться.

Поддержка браузера

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

  • Firefox 3.5+
  • Chrome 5.0+
  • Safari 5.0+
  • Opera 10.60+
  • Internet Explorer 9.0+

Поддержка в мобильных браузерах еще лучше, как вы можете видеть в этом резюме:

  • Android 2.0+
  • iPhone 3.0+
  • Opera Mobile 10.1+
  • Symbian (S60 третьего и пятого поколения)
  • Blackberry OS 6

API геолокации широко поддерживается. Возможно, вам интересно, что вы можете сделать, если столкнулись с браузером, который не поддерживает API геолокации. Верьте или нет, для устранения этой проблемы существует несколько полифилов и прокладок. Наиболее заметными решениями являются тот, который был создан Мануэлем Бихом и легкой прокладкой, созданной Полом Ирришем.

Демонстрация

Теперь, когда мы знаем все аспекты API геолокации, пришло время увидеть его в действии. Эта демонстрация полностью функциональна и использует все методы и объекты, описанные в этой статье. Цель проста: каждый раз, когда выполняется запрос на обнаружение позиции устройства, данные о местоположении отображаются пользователю в виде списка.

Демонстрация содержит три кнопки, позволяющие выбрать операцию, которую вы хотите выполнить. Демонстрация также определяет, поддерживает ли браузер API геолокации или нет. Если это не так, вы увидите сообщение «API не поддерживается», и кнопки отключены.

Исходный код демонстрации показан ниже, но вы также можете играть с демо-версией API геолокации.

Заключение

В этой статье мы узнали о Geolocation API. Мы видели, что это такое, как и когда его использовать.

API геолокации — полезный инструмент для улучшения пользовательского опыта и может служить многим целям. Поддержка широка, но не забывайте, что более старые версии Internet Explorer ее не поддерживают.

Как мы обсуждали в этой статье, вы должны знать, что некоторые данные о местоположении, такие как speed , altitude и heading , не всегда доступны. Также не забывайте использовать Geolocation API с осторожностью, потому что это требует значительного заряда батареи, особенно на мобильных устройствах, оснащенных чипом GPS.

Источник

Оцените статью