Предыстория
Однажды, после очередной жалобы на несоблюдение графика перевозок маршрутками в г. Ульяновске, меня пригласили в отдел транспорта при мэрии, чтобы обсудить проблему.Разговор, как таковой, был не слишком полезный. Чиновники посетовали на то, что у них связаны руки, на своенравность перевозчиков и заикнулись про то, что в ближайшем будущем все автобусы малой вместимости будут оборудованы датчиками Глонасс и вот тогда-то за ними можно будет осуществлять круглосуточный контроль. Продемонстрировать систему не получилось, хотя очень стремились. Ну так бывает, что в самый нужный момент, что-то не работает.
Чуть позже, пользователи получили возможность увидеть её в действии на сайте http://askcompany.com
Тогда мне пришла в голову мысль, что неплохо было бы иметь возможность мониторить маршрутки с телефона.
От идеи к реализации
Изучил страницу (спасибо замечательному "Инструменту разработчика" в Google Chrome), запросил api-key для Yandex Map Kit и за вечер написал первую версию приложения "Где моя маршрутка?".Приложение работает также, как и веб-сервис. Добавляет пользовательские слои поверх Яндекс.Карт и обновляет информацию используя ajax-запросы к серверу.
"Война" с разработчиками сервиса
Сразу после того, как разместил приложение в Android Market (тогда он еще так назывался), разработчики сервиса изменили формат ответа. Пришлось обновлять программу.После этого, разработчики стали проверять заголовок запроса. Поэтому очередное обновление было связано с необходимостью притворяться "своим".
Наверное, так совпало, но и на этом разработчики не остановились и стали требовать идентификатора сессии. Надо ли говорить, что и этот рубеж был преодолен успешно? :)
Реверсинг Yandex Map Kit
Yandex Map Kit для Android в текущей реализации не предусматривает создание пользовательского слоя, который бы отвечал за свою отрисовку. Разместить ballon'ы или bitmap - пожалуйста, но и только.Мне же хотелось иметь возможность отрисовки произвольной графики, например ориентированного по движению треугольника или ломаной линии для отображения маршрута.
Класс BallonOverlay в Yandex Map Kit наследуется от Overlay и использует для отрисовки списка OverlayItem реализацию интерфейса IRender.
Как точно это внутри работает помог понять Java Decompiler. Если посмотреть исходные тексты моего приложения, то можно увидеть, что в реализации BusOverlay используются члены a,b,c базового класса. Не совсем говорящие за себя названия, правда?
Также без реверсинга было тяжело понять, почему маршрут рисовался над автобусами независимо от того, в каком порядке были добавлены соответствующие слои. Оказалось, что перед отрисовкой происходит сортировка OverlayItem и для того, чтобы повлиять на ранжирование нужно использовать метод setPriority(int priority).
Последнее обновление
На прошлой неделе мне сообщили, что моя программа не может получить данные с сервера. Оказалось, что прежний адрес больше не доступен. Я расстроился и убрал программу из Google Play. На следующий день из твиттера узнал, что сервис переехал на другой домен.Кроме того, что сменили адрес, добавили новый функционал (просмотр автобусных остановок и просмотр сразу нескольких маршрутов). Сменить адрес в программе оказалось недостаточно, поменяли и способ получения идентификатора сессии. Исправил и снова опубликовал приложение в Google Play.
А теперь к главной причине написания этого поста. После последнего обновления решил выложить исходные тексты на GitHub http://github.com/moadib/PublicTransport
Комментариев нет:
Отправить комментарий