GPS в смартфоне: что это и как работает?
Смартфоны давно перестали быть простыми «звонилками». Своим владельцам они открыли массу новых возможностей.
На первом месте полноценный скоростной доступ в интернет и общение в социальных сетях и мессенджерах. Но не менее востребовано и GPS-позиционирование, о котором мы сейчас подробно расскажем.
Что такое GPS?
GPS — система навигации, которая определяет местоположение смартфона, строит маршруты и позволяет найти нужный объект на карте.
Практически в каждый современный гаджет встроен GPS-модуль. Это антенна, настроенная на сигнал спутников системы геолокации GPS. Изначально она была разработана в США для военных целей, но позже ее сигнал стал доступен всем желающим. GPS-модуль гаджет является принимающей антенной с усилителем, но передавать сигнал она не может. Получая сигнал от спутников, смартфон определяет координаты своего местоположения.
Практически каждый современный хотя бы раз пользовался GPS-навигацией на смартфоне или планшете. Потребность в ней может возникнуть в любой момент у людей разных профессий и разного рода занятий. Она необходима водителям, курьерам, охотникам, рыболовам и даже простым пешеходам, оказавшимся в незнакомом городе. Благодаря такой навигации можно определить свое местонахождение, найти нужный объект на карте, выстроить маршрут, а при наличии доступа в интернет объехать пробки.
Оффлайн-карты для GPS
Google разработала для своей операционной системы Android специальное геолокационное приложение — Google Maps. Оно быстро находит спутники, разрабатывает маршруты до объектов и предлагает альтернативы. К сожалению, при отсутствии зоны покрытия сотовой сети Google Maps не работает, так как географические карты тут подгружаются через интернет.
Для навигации без использования сети лучшим выходом будет скачать приложения с поддержкой оффлайн-карт, например, Maps.me, Navitel и 2GIS. Также можно установить приложение «Карты: транспорт и навигация» для Google Maps.
В этом случае придется расходовать интернет-трафик для загрузки карт не придется — они будут всегда в вашем устройстве, независимо от местоположения. Особенно это актуально при нахождении за границей, так как стоимость роуминга для доступа в интернет весьма высока.
Как включить GPS на Android?
Активация GPS-модуля в операционной системе Android возможна двумя способами:
- Верхняя шторка. Проведите по дисплею сверху вниз и в открывшемся меню нажмите кнопку «Местоположение», «Геолокация» или «Геоданные» (зависит от версии Android).
- В настройках Android найдите пункт аналогичные пункты передвиньте флажок в положение «Включено».
Во время активной работы навигационной системы смартфона заряд его аккумулятора начинает расходоваться достаточно активно, поэтому стоит позаботиться о дополнительных источниках питания. Например, за рулем нужно воспользоваться автомобильной зарядкой, а при передвижении на велосипеде или пешком — повербанком .
Также стоит помнить, что уверенный прием спутникового сигнала возможен на открытой местности, поэтому при нахождении в помещении или туннеле геолокация становится невозможной. Пасмурная погода также влияет — из-за туч устройство дольше ищет спутники и менее точно определяет свои координаты.
Не так давно GPS была единственной системой геолокации, поэтому в ранних версиях Android упоминалась только она, а кнопка активации службы так и называлась. С 2010 года полноценно заработала российская спутниковая система ГЛОНАСС, а с 2012 — китайская Beidou.
Источник
Определение доступности GPS в Android
Эта статья, надеюсь, станет хорошим подспорьем начинающим в области программирования под Android. А может даже и матерые профи что-нибудь почерпнут.
Итак, понадобилось мне как-то определять, доступен ли в настоящее время GPS-фикс. Казалось бы, LBS (location-based service) — вещь перспективная и популярная, и Google, прекрасно это понимая, предоставит простой в обращении инструмент для их разработки. Ага, разбежался… Не так-то все и просто, поэтому приходится в определенной мере изощряться.
Ну и в чем тут у нас собственно проблема? Проблема в определении текущего местоположения пользователя. Видов существует несколько, но ТЗ велит использовать GPS и позиционирование по сотовым вышкам. Задача — определить текущие координаты с максимальной точностью, т.е. в идеале по GPS. Если он недоступен, то по вышкам. Если есть сигнал GPS, то все легко и просто — берем со спутника координаты и делаем с ними что угодно. Если сигнала нет, то при обработке координат вы рискуете нарваться на null, в чем очень мало хорошего, а при недолжной обработке исключений может быть еще и что-нибудь с печальными последствиями. Значит, надо как-то определить, а есть ли у нас фикс?
Ну что ж, проблема видна — будем решать!
Начнем с ковыряния LocationManager. Есть в нем занятное свойство isProviderEnabled(), возвращающее булево значение. Ура? Рано… Это значение всего лишь характеризует, включен GPS-приемник вашего телефона или нет (собственно, можно было и по названию догадаться). Первый блин получился как всегда, идем дальше.
Залезем во внутренности LocationListener. Что мы видим? Ба, да это обработчик onStatusChanged()! В идеале реагирует на изменение статуса провайдера, выставляя соответствующие значения. В идеале… Не реагирует он ни на что начиная с андроида версии 2.1! С грустью проходим мимо.
Продолжим? Конечно продолжим! Очевидным выглядит следующий финт ушами — сравнение времени последнего пришедшего фикса с текущим системным временем. Казалось бы, логично — раз фикс старый, то GPS недоступен. Не совсем так: фиксы приходят только при движении, соответственно можно перепутать недоступность спутников с простым сидением на месте. Согласитесь, будет не совсем приятно, если вы сидите себе сидите, и тут вдруг — оппа! — и ваш телефон решил, что вы телепортнулись метров на 400-500. Снова не то, но приемчик запомним — пригодится.
Теперь посмотрим в сторону GpsStatus.Listener, реализующий метод onGpsStatusChanged(int event). Переменная event может принимать несколько значений, нас же интересует GPS_EVENT_SATELLITE_STATUS. Возникновение такого события говорит о том, что ваш приемник анализирует GPS-спутники. Вот это-то нам и надо! Дальше все просто и понятно — берем текущий статус GPS и вытаскиваем из него доступные спутники. В самом простом случае нас просто интересует их количество.
Небольшое отступление для начинающих в области навигации. Для определения текущей координаты нам в общем-то необходимо три спутника (для трехмерной координаты). Но это если у вас есть атомные часы, что очень-очень редко в случае мобильных девайсов. Поэтому для синхронизации времени нам потребуется еще один спутник.
Выглядеть обработчик статуса будет примерно так:
В переменной status лежит информация о всех доступных спутниках
Итак, дальше все ну совсем замечательно — смотрим количество спутников, если их меньше четырех, то фикса никакого нет и быть не может, значит используем другие методы позиционирования (уж извините, но конкретную реализацию описывать не буду). Этот метод можно скрестить с сопоставлением времен, описанным на пару абзацев выше. Так можно выставить определенный период «доверия» фиксу
Подобьем баланс. Все выше приведенное не дает вам точных гарантий определения доступности фикса. На самом деле просто отсекаются ситуации, в которых фикса уж точно нет. Это, конечно, не совсем то, что хотелось, но уже что-то!
UPD: Похоже, решение найдено! Свершилось это благодаря r_ii.
Итак, ваш GPS-приемник, будучи во включенном состоянии, постоянно принимает сигналы в соответствии с протоколом NMEA. Вот его-то нам и надо!
Для просмотра этих сигналов добавляем в код следующее:
За этот код спасибо вот этому топику 2m0nd. Полное описание протокола здесь (pdf, англ).
Собственно, дело за малым — парсить полученную строку. В данном случае нас интересует строки с ключевым (первым) полем $GPGGA, а в них параметр №6, по умному называемый GPS Quality Indicator. Он принимает следующие значения:
- 0-фикс не доступен
- 1-GPS-фикс
- 2-дифференциальный фикс
Бинго!
Источник
Кто использует GPS, камеру, микрофон т.д. на андроид?
Как узнать, какая программа использует GPS? Камеру, микрофон и т.д.
Просто стало интересно
Кто использует GPS, камеру, микрофон т.д. на андроид?
Я точно не использую.
Были какие-то приложения для этого. Но какой в этом смысл если не ограничивать/подсовывать фальшивые данные. А это делается через одно место.
Как узнать, какая программа использует GPS? Камеру, микрофон и т.д.
Настройки => Приложения => Кликаешь на интересующее => Смотришь внизу список разрешений.
Да и при установке требуемые разрешения тебе показываются.
В 4.4 появилась возможность ограничивать доступ к этим вещам, можно например настроить, чтобы при попытке использовать камеру появлялось окно разрешить/запретить. В более ранних версиях нужно смотреть разрешения при установке приложения, вы вообще андроидом пользовались?
а если у тебя 40 приложений, все используют камеру, но прямо сейчас — только какое-то одно, как определишь?
Если ты поставил всем 40 «всегда разрешать», то никак и ССЗБ 🙂
кстати, в андроиде вообще есть неэксклюзивный доступ к камере, чтобы ее юзало несколько приложений сразу?
Не знаю. Вряд ли.
Да и при установке требуемые разрешения тебе показываются.
У тебя сверхмозг штоле все это запомнить. Да ещё обновлять информацию, когда они обновляются и требуют доп. разрешения.
А приложения не крашаться, если не давать каких-то разрешений или он только про камеру спрашивает?
У тебя сверхмозг штоле все это запомнить.
Нах^W Зачем это запоминать, если можно сразу увидеть что требования неадекватны.
Я думаю зависит от приложения, я одному запретил доступ к контактам, оно работало и не крешилось, но постоянно повторяло запрос от чего постоянно вылезал хинт, что ему отказали в доступе.
если можно сразу увидеть что требования неадекватны.
Лень даже разбираться в этой простыне. При обновлении всё равно запросит новые разрешения.
Лень даже разбираться в этой простыне.
Если вам лень в этом разбираться, то зачем вообще задаваться вопросом о требуемых разрешениях?
При обновлении всё равно запросит новые разрешения.
Это происходит весьма и весьма редко. И изменения, опять же, они отображаются, причём только они, а не весь список.
Вот есть, к примеру, скайп. Хочет камеру. Вполне адекватно для программы для общения через камеру. Но когда эта программа включает камеру не во время видеовызова, это уже неадекватно. Вот пресечь такой род неадекватности андроид не позволяет.
Ааааа, так вот о чём речь.
Вот пресечь такой род неадекватности андроид не позволяет.
Это смотря какой. CyanogenMod вполне себе позволяет (У MIUI, из коробки, тоже такая возможность есть). Да и вообще, если есть Root — можно поставить соответствующие приложения по рулению правами, так чтобы при доступе к камере выводился запрос разрешения.
Если вам лень в этом разбираться, то зачем вообще задаваться вопросом о требуемых разрешениях?
Я ими и не задаюсь, давно положил болт на это. А вообще, изготовителям андройда надо лучше думать над систематизацией разрешений. Потому как эта простыня — это не ОК.
А вообще, изготовителям андройда надо лучше думать над систематизацией разрешений.
И как это, в итоге, должно выглядеть?
Я бы хотел помимо списка разрешений при установке ещё лог того какое приложение чем занималось. Кто смотрит в камеру, кто смотрит местоположение, кто шерстит в /sdcard/DCIM, кто ковыряется в списке контактов, кто в смс и т.д.
Максимум, 3-5 пунктов разрешений, либо строчки, скрытые под выпадающим списком (что хуже).
Это будет означать слишком грубую систему прав. А ведь идея-то в том чтобы давать минимальные права приложениям.
либо строчки, скрытые под выпадающим списком (что хуже).
Оно так и работает.
Приложение требует:
Доступ к камере, доступ к сети, доступ к отправке СМС, доступ к аккаунтам, доступ к карте памяти и отключение спящего режима. Всего 6 штук. Расскажи как уместить в пять.
На мой взгляд так, как оно сейчас, с группировкой — оптимальное решение (разве что группировку немного по другому сделал).
Да и при установке требуемые разрешения тебе показываются.
Толку-то, сейчас любая программа требует доступ в инет, список контактов, текущим координатам и отправку смс. Более того, чтобы «не ломать обновления» девелоперы «рекомендуют» сразу выставлять максимум прав чтобы их потом не менять.
По-моему, я уже где-то слышал про софт которые умеет определять не подсунули ли ему фейковые данные. Скажем, пустая записная книга не прокатит. Или если gps-координаты вообще не меняются то прога откажется работать. Вот так вот 🙁
Тебе не кажется, что здесь происходит деление на ноль?
При установке показывать разрешение, а потом показывать лог/уведомления что чем занимается.
Толку-то, сейчас любая программа требует доступ в инет, список контактов, текущим координатам и отправку смс. Более того, чтобы «не ломать обновления» девелоперы «рекомендуют» сразу выставлять максимум прав чтобы их потом не менять.
Увы, никакая система говнокодеров не исправит 🙁 Нормальные приложения с адекватными требованиями то есть, и немало. Хотя от неправомерного использования разрешений (как в случае с скайпом, выше, это, конечно не защитит).
По-моему, я уже где-то слышал про софт которые умеет определять не подсунули ли ему фейковые данные. Скажем, пустая записная книга не прокатит. Или если gps-координаты вообще не меняются то прога откажется работать. Вот так вот 🙁
Как ответ, появились системы руления прав, умеющие предоставлять фальшивые. Вообще интересная тема — целую статью написать можно.
При установке показывать разрешение, а потом показывать лог/уведомления что чем занимается.
А, ну вот это тема. Обычно приложения для руления правами так же ведут и соответствующий лог. Правда в самой системы мы такого, увы, не увидим — это «слишком сложно для обычного пользователя».
Источник