GPS-монитор под андроид «KidsTrack»
Задача: наступает лето, дети все больше времени проводят где-то на улице, и я бы хотел знать, где они находятся. Идеальный вариант — я просто даю им с собой старый андроидный телефон, и затем наблюдаю за ними по карте на большом домашнем мониторе.
В этой статье я расскажу, почему и как я написал свое первое приложение для Андроид с функциями GPS «KidsTrack», и какие открытия при этом сделал. Статья будет полезна тем, кто недавно начал программировать под Android.
Поиски на Google Play выдали мне сотни различных приложений с функциями GPS-мониторов. Я уж начал их было перебирать, но примерно на 2-м десятке я осознал, что затраты времени на выбор могут оказаться вполне сравнимыми с затратами времени на разработку. Ведь мои функциональные требования очень просты:
- приложение должно периодически отправлять анонимные координаты на сервер,
- сервер должен показывать карту с маркером в соответствующем месте.
Это все!
Есть еще требования, которые не связаны с функциональностью, но которые не менее важны:
- отсутствие необходимости регистрации, и привязки аккаунтов
- бесплатность
- отсутствие рекламы
- отсутствие ненужных функций, которые уже есть или в телефоне, или в других приложениях, типа обмена сообщениями, тревожных кнопок, уведомлений, стираний данных, блокировок телефона, чата, и т.п.
И да, координаты будут хранится на сервере, который не бесплатен. Но хостинг сейчас стоит такие копейки, что я считаю неправильным брать с людей деньги за хранение пары чисел (или даже нескольких килобайт).
Одним словом, попробовав несколько приложений из Google Play, я решил написать трекер сам.
Далее, все тривиально: установил Android Studio, нарисовал единственный экран с 3-мя кнопками, написал, как мне казалось, сервис, отладил все в эмуляторе, затем в USB-дебаггере, вроде все заработало.
Но как только попробовал запустить на физическом устройстве — начались сюрпризы. О некоторых из них я хотел бы рассказать.
Сюрпризы управления питанием
Реальные андроид-устройства стремятся отключить себе питание при любой возможности. Постоянно получают питание лишь весьма примитивные системные часы (модуль мобильной связи здесь он не рассматривается). В часах есть регистр(ы), куда посредством AlarmManager можно записать время следующей пробудки процессора телефона. Если процессор не разбудят часы, то он так и будет продолжать спать ничего не делая. Сделано это по простой причине: включенный процессор разрядит батарею за час. Поэтому если надо, чтобы сервис что-то делал раз в минуту, то приемы десктопного программирования вроде Thread.sleep(60000) не подойдут, а вместо этого надо пользоваться AlarmManager, примерно вот так:
В этом примере мы программируем AlarmManager разбудить телефон через 1 минуту, и отправить интент START_ALARM всем приложениям, кто на него подписан.
Прием интентов во всех учебниках осуществляется объектом BroadcastReceiver, однако если нам нужно, чтобы:
- телефон пробуждался из глубокого сна
- запускал наш сервис,
- не засыпал до завершения работы
то BroadcastReceiver не подойдет, и вместо него надо использовать WakefulBroadcastReceiver — этот объект гарантировано не допустит впадения телефона в сон до тех пор, пока не будет вызван метод completeWakefulIntent. Во всяком случае у меня так и не получилось заставить BroadcastReceiver работать надежно на физическом устройстве.
Если ваш сервис теоретически может выходить в интернет через WiFi, то вам необходимо позаботится, чтобы у WiFi-модуля во время соединения тоже было включено питание, так как оно у него отдельное. Если этого не сделать, то бывает трудно понять почему приложение не работает на физическом устройстве: ведь при отладке на эмуляторе или устройстве, подключенном к дебаггеру через USB, питание модуля WiFi не выключается, и все отлично работает. Запретить отключать питание WiFi можно так:
Сюрпризы GPS
В первой версии приложения я сделал определение координат устройства только с использованием провайдера «GPS». И очень было мне удивительно наблюдать на сервере, как более 90% устройств не смогли определить координаты и присылали нули.
Как оказалось, GPS – довольно капризная технология с множеством ограничений, низкой скоростью и непредсказуемой точностью. При использовании традиционной GPS сенсор приемника должен получить данные обо всех GPS-спутниках (а их более 2х десятков), среди всех них выбрать наиболее подходящие, и уже по ним вычислять координаты. Получение данных и перебор могут занимать 5 минут и более, поэтому первый «холодный» старт GPS всегда самый медленный.
Если GPS-приемник имеет часы и помнит прошлые координаты и положения спутников, то он может использовать эти данные для определения тех спутников, к которым можно привязаться в данный момент. Поэтому повторный запуск GPS обычно происходит намного быстрее.
В современных смартфонах первоначальное грубое определение координат может осуществляться по близлежащим передающим сотовым вышкам, что так же позволяет ускорить «холодный старт» GPS. Для использования этого способа требуется разрешение на использование провайдера «network» в Manifest-е, так для определения я координат вышек может использоваться интернет.
Еще одна функция провайдера «network» — определять координаты по видимым WiFi — сетям. Определение осуществляется путем поиска координат видимых в данный момент сетей по их именам и MAC-адресам на серверах Google через интернет. Разумеется, в фоновом режиме и без лишних уведомлений идет и обратный трафик: телефон, когда определил свои координаты по GPS, может по-тихому послать данные об окружающих его WiFi-сетях на серверы Google, чтобы таким образом поддерживать актуальное состояние базы WiFi-сетей. Грустные размышления о потенциальной власти Google над владельцами Андроидов и WiFi-сетей оставим за рамками этой статьи…
Прояснив все эти нюансы я в авральном порядке подправил приложение, чтобы оно использовало не только провайдера «GPS» но и «network». После этого типичная последовательность вызовов метода onLocationChanged стала выглядеть так:
Я все-таки очень хотел задействовать GPS, так как обычно это самый точный способ, поэтому я установил время ожидания сигнала от GPS-сенсора 30 секундам, а если это первый пуск — 2-м минутам. И если GPS-сенсор так и не сработал, то используются координаты от провайдера «network». После этого изменения устройства стали присылать на сервер нормальные, ненулевые координаты.
Точность GPS также оказалась весьма условной. Например нередко точность координат, получаемых с сенсора неподвижного лежащего устройства может выглядеть так:
Из этих данных ясно, что GPS хорош для нахождения зданий или других больших объектов, но найти человека в толпе, или телефон в сугробе будет непросто.
Отдельно стоит упомянуть питание GPS. Модуль GPS весьма прожорлив, поэтому в учебниках рекомендуют при вызове requestLocationUpdates не устанавливать слишком короткие параметры минимального интервала по времени и по расстоянию. Но в моих опытах с 3-мя различными физическими устройствами оказалось, что постоянно включенный модуль GPS садит батарею одинаково при различных параметрах. Потом уже я нашел где-то упоминание, что эти параметры влияют только на частоту вызова метода onLocationChanged, но не обязательно на энергопотребление самого сенсора.
Прочие сюрпризы
Google Play: Первая версия пролежала на Google Play два дня, после чего была заменена новой, с исправленным алгоритмом определения координат. Несмотря на то, что это произошло уже две недели назад, я на сервере продолжаю видеть, что очень часто продолжают происходить активации старой версии. Я уже и добавил сообщение о необходимости обновления на веб-странице мониторинга, но это не всегда помогает. Непонятно откуда вообще люди берут старую версию. Я не знаю чем это объяснить.
Пользователи: Почти треть пользователей, установивших приложение, никогда не открывала страницу, на которой устройство можно мониторить. Без страницы мониторинга приложение бесполезно, поэтому объяснить это феномен я тоже не могу.
Яндекс.Карты: Страница мониторинга изначально была реализована с использованием API Яндекс.Карт, так как там не требуется ID, и нет ограничений на количество загрузок карты в день. Но оказалось, что на слабых устройствах Яндекс.Карты или тормозят, или вообще не открываются. Пришлось эту страничку делать в 2-х вариантах: Яндекс.Карты для настольных компьютеров, и Google Maps для слабых мобильных устройств. Google Maps оказались существенно быстрее.
Источник
Пишем gps трекер android
Недавно в «известном узкому кругу» чатике, у нас разгорелся спор, относительно возможности использования смартфона как gps-трекера, хранящего историю перемещений и позволяющего дома в тапочках, с бокалом вина ее проанализировать и скачать заветные путевые траектории. Мне стало интересно, а действительно, имеет-ли это место быть и нормально-ли будет работать? И вот что получилось.
Для начала определимся, что я вкладываю в понятие трекера и чем он отличается от логгера. Вроде как, принято выделять три основных типа GPS-устройств:
GPS-навигаторы — показывают вам, где вы находитесь или куда идти (на карте или просто стрелочкой).
GPS-трекеры — которые записывают ваш маршрут и сообщают о нем Куда Надо или выкладывают на сервер (через GSM или спутник).
GPS-логгеры — просто записывают маршрут для последующей обработки.
Хотя в наш век сложных электронных технологий все перемешалось. Устройство с встроенной памятью правильно назвать логгером. Но если оно при этом передает данные в режиме реального времени, оно с полным правом может именоваться трекером. Например мой SPOT однозначно трекер, но не логгер. Пока писал, сам чуть не запутался 🙂
Зачем мне нужен еще и трекер в смартфоне, когда есть спутниковый? Во-первых, одна голова хорошо а две лучше. Во-вторых, не стоит забывать, обслуживание SPOT стоит денег, по-нынешнему курсу это около 10000 в год, причем оплатить надо единоразово. В третьих, SPOT предназначен больше для успокоения родных и близких — трек получается не слишком подробным. Это связано с невозможностью ставить точки на карте чаще, чем раз в 10 минут. Как итог, SPOT имеет смысл применять для длительных поездок, где такая подстраховка действительно не будет лишней.
Для остальных случаев, вполне подойдет решение, к которому я написал эту небольшую вступительную простыню:
01. Идем на сайт GPShome.ru, регистрируемся и скачиваем на смартфон приложение.
02. После установки приложения, привязываем устройство, указав в качестве идентификатора IMEI устройства.
Важно. чтобы на устройстве и в личном кабинете был выставлен один часовой пояс, иначе данные будут приходить с ошибками.
03. В приложении на смартфоне есть меню настроек, где в общем-то все интуитивно понятно.
Приложение использует данные акселерометра, т.е. определяет, с какой частотой отправлять отчеты в движении и в состоянии покоя. Для состояния покоя я выбрал раз в час, что в теории экономит батарею, а для движения раз в 15 секунд, чтобы трек получался как можно более плавным.
04. В общем-то и все настройки, можно пользоваться! Приложение висит в фоне и ничем себя не выдает. При перезагрузки устройства оно запускается автоматически.
05. Теперь треки пишутся всегда, и получаются довольно подробными и плавными.
06. Хотя бывают досадные ошибки в позиционировании, когда отдельная точка ставится в другом месте и эстетика трека страдает. Что в общей картине не влияет на информативность. Особенно это проявляется в пеших прогулках.
07. Приложение разбивает треки на отдельные поездки, анализируя информацию о стоянках. В дальнейшем треки можно смотреть как по отдельности, так и общим отчетом за 1 или несколько суток. Можно так же их выгрузить в привычных форматах GPX или KML.
08. Отдельным приятным моментом является возможность менять слои карт. Например включить Google Sattelite
Сервис мне очень понравился, несмотря на мелкие огрехи в позиционировании. Он не навязчив (про существование приложения на смартфоне я уже забыл), всегда доступен и, главное, бесплатен! Надо понимать, что это не замена навигационным программам, а дополнение. Очень важный момент, за который я переживал это батарея смартфона. Но переживания оказались напрасны — я не заметил повышенного расхода. Может он и есть, но гораздо больше на расход батареи влияют пресловутые соц-сети.
Еще одним плюсом является и то, что отправляясь куда-то, можете дать логин/пароль вашим близким и на душе у них будет чуточку спокойнее.
— Для того, чтобы наблюдатели могли лишь наблюдать, без возможности изменения параметров надо в личном кабинете в «настройках» создать «оператора», с отдельным логином и паролем.
— Чтобы минимизировать «рваные» точки на треке, в личном кабинете, в настройках трекера (в нашем случае это смартфон) во вкладке «фильтры» приводим значение параметров к рекомендованным и ставим галочку на коррекции трека по данным gps. В принципе, можно поиграться с настройками коррекции HDOP, пока результат вас не будет устраивать.
Еще отмечу крайне приятную и отзывчивую службу тех поддержки на сайте.
Не обошлось без ложки дегтя. В бесплатной версии треки хранятся сутки. Наиболее доступный тариф — 400 руб./мес. Далее описание с сайта:
Срок действия тарифа: 1 календарный месяц, автоматическая пролонгация на следующий месяц при наличии средств на лицевом счёте.
Полнофункциональный тариф. Онлайн-мониторинг, история перемещений за 12 месяцев. Контрольные гео-зоны, все отчёты, оповещения о событиях и все остальные функции сервиса мониторинга.
Списание средств с лицевого счёта производится в момент активации или автоматического пролонгирования обслуживания. При отсутствии средств обслуживание объекта приостанавливается до пополнения счёта (при этом доступ к истории перемещений сохраняется).
Источник