Разработка информационных систем на базе мобильных интерфейсов

 

Министерство образования и науки Российской Федерации

Федеральное государственное автономное образовательное учреждение высшего профессионального образования

«Уральский федеральный университет

имени первого Президента России Б.Н.Ельцина»

Математико-механический факультет

Кафедра высокопроизводительных компьютерных технологий







Разработка информационных систем на базе мобильных интерфейсов














Екатеринбург



РЕФЕРАТ


Баева А.И. РАЗРАБОТКА ИНФОРМАЦИОННЫХ СИСТЕМ НА БАЗЕ МОБИЛЬНЫХ ИНТЕРФЕЙСОВ, дипломная работа: стр.107, рис. 20, прил. 1

Ключевые слова: ИНФОРМАЦИОННАЯ СИСТЕМА, ЭЛЕКТРОННАЯ КАРТА, ИНФОРМАЦИОННАЯ ПОДДЕРЖКА ПОЛЬЗОВАТЕЛЯ, ANDROID, ГЕОКОДИРОВАНИЕ, ИНФОРМАЦИОННАЯ ВИЗУАЛИЗАЦИЯ.

Объект исследования - информационные системы для мобильных устройств.

Цель работы - разработка туристической карты для мобильных устройств на платформе Android.

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

Результатом работы стала прототипная реализация приложения (Туристическая карта) для мобильных устройств на платформе Android.





Содержание


ВВЕДЕНИЕ

1.ГОРОДСКИЕ ИНФОРМАЦИОННЫЕ СИСТЕМЫ И МОБИЛЬНЫЕ ИНТЕРФЕЙСЫ

1.1 Введение в ГИС

1.2 Организация данных в ГИС

1.3 Что ГИС могут сделать для туризма

1.4 Предметно ориентированные ГИС

1.5 Основные концепции информационной визуализации, используемые в ГИС

1.6 ГИС и мобильные интерфейсы

2.ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА РАЗРАБОТКИ

2.1 Операционная система Google Android

3.ОПИСАНИЕ ПРОЕКТА ПРИЛОЖЕНИЯ

3.1 Структура программы

3.2 Описание компонентов программы

5.3 Программная реализация

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА

ПРИЛОЖЕНИЕ





Введение


Главное направление совершенствования мобильных телефонов можно определить одним понятием: конвергенция технологий. Мобильные телефоны объединили в себе едва ли не всё, что можно и разумно объединять под корпусом одного устройства.

Глядя на сегодняшний мобильный телефон, на какую-нибудь до предела функциональную и модную модель, можно подумать, что это - предел совершенства, но вспомните, как мы смотрели, например, на «кирпич» от ericsson году так в 1999-м и думали то же самое. Наверное, глядя на телефон в 2020-м, мы с улыбкой будем вспоминать «совершенные» аппараты 2013-го.

Основные задачи телефона прошлого - совершать и принимать звонки, писать sms. Сегодня эти задачи дополнилась работой с интернет-ресурсами, прослушиванием музыки, фотосъемкой, использованием игр и приложений. Мобильный будущего, скорее всего, добавит к списку основных задач просмотр телепрограмм, управление различной техникой, функции контроля состояния здоровья своего владельца и возможно многое другое.

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

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

Сегодня на территории нашей страны активно эксплуатируется больше 10 млн. номеров мобильных операторов, о чем еще десять лет назад отечественные провайдеры могли только мечтать. Рынок мобильных технологий развивается настолько быстро, что за его изменениями поспевают не все, даже очень крупные компании. Последние пять лет показали, что современный оператор связи должен быть максимально гибким, держать руку на пульсе мировых новинок и изобретений. Тот, кто исповедует консервативный подход к развитию, достаточно быстро начнет терять рыночные позиции, будучи вынужденным измениться или уступить место другим компаниям.

Эксперты обращают внимание потребителей на тот факт, что сейчас на рынке доступно несколько мобильных платформ, стремительную популярность среди которых в последнее время приобретает iOS и Android. На рынке США компания Apple уже давно заняла пальму первенства в сегменте дорогих и презентабельных мобильных устройств, постоянно удивляя клиента интересными новинками. На примере Apple, видно как кардинально может измениться тот или иной рынок с появлением новых «девайсов».

Перспективы развития рынка мобильных технологий весьма благоприятны, поскольку изменяется не столько сам рынок, сколько потребитель. Если вчера мечтой многих был безлимитный тариф, то сегодня с широким распространением мобильного интернета прерогативы существенно изменились. С появлением на отечественном рынке 3G решений, произошло заметное перераспределение клиентов в пользу тех компаний, которые были готовы к запуску данной услуги. Современному владельцу мобильного устройства уже недостаточно просто общаться, ему нужен круглосуточный доступ в глобальную сеть, посредством которой можно не только находить нужную информацию, но и общаться с друзьями, сообщать о своем местонахождении и многое другое.

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

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





1. Городские информационные системы и мобильные интерфейсы


.1 Введение в ГИС


Географическая информационная система (ГИС, геоинформационная система) - программно-аппаратный комплекс, предназначенный для сбора, управления, анализа и отображения пространственно распределенной информации. ГИС - не только и не столько информационные системы для географии, сколько информационные системы с географически организованной информацией. В простейшем варианте географические информационные системы - сочетание обычных баз данных (атрибутивной информации) с электронными картами, то есть мощными графическими средствами.

Основная идея ГИС - связь данных на карте и в базе данных. ГИС - это и аналитические средства для работы с любой координатно-привязанной информацией. В принципе, ГИС можно рассматривать как некое расширение концепции баз данных. В этом смысле ГИС фактически представляет собой новый уровень и способ интеграции и структурирования информации. ГИС предлагает совершенно новый путь развития картографии. Преодолеваются основные недостатки обычных карт - их статичность и ограниченная емкость как носителя информации. В последние десятилетия бумажные карты из-за перегруженности информацией становятся нечитабельными. ГИС же обеспечивает управление визуализацией информации. Появляется возможность выводить (на экран, на твердую копию) только те объекты или их множества, которые интересуют нас в данный момент. Фактически осуществляется переход от сложных комплексных карт к серии взаимосвязанных частных карт. При этом улучшается структурированность информации, а, следовательно, повышается эффективность ее обработки и анализа. В ГИС карта оживает и становится действительно динамическим объектом в смысле:

изменяемости масштаба;

преобразования картографических проекций;

варьирования объектным составом карты;

возможности опрашивать через карту в режиме реального времени многочисленные базы данных;

изменения способа отображения объектов (цвет, тип линии и т.п.), в том числе и определения символогии через значения атрибутов, то есть синхронизации визуализации с изменениями в базах данных;

легкости внесения любых изменений.

ГИС являются классом информационных систем, имеющим свои особенности. Они построены с учетом закономерностей геоинформатики и методов, применяемых в этой науке. ГИС как интегрированные информационные системы предназначены для решения различных задач науки и производства на основе использования пространственно - локализованных данных об объектах и явлениях природы и общества. Неразрывно с ГИС связаны геоинформационные технологии. Геоинформационные технологии можно определить как совокупность программно-технологических средств получения новых видов информации об окружающем мире. Геоинформационные технологии предназначены для повышения эффективности: процессов управления, хранения и представления информации, обработки и поддержки принятия решений.

ГИС имеет ряд особенностей, которые необходимо учитывать при изучении этих систем. Одна из особенностей ГИС и геоинформационных технологий состоит в том, что они являются элементами информатизации общества. Это заключается во внедрении ГИС и геоинформационных технологий в науку, производство, образование и применение в практической деятельности получаемой информации об окружающей реальности. Геоинформационные технологии являются новыми информационными технологиями, направленными на достижение различных целей, включая информатизацию производственно-управленческих процессов. Другой особенностью ГИС является то, что как информационные системы они являются результатом эволюции этих систем и поэтому включают в себя основы построения и функционирования информационных систем. ГИС как система включает множество взаимосвязанных элементов, каждый из которых связан прямо или косвенно с каждым другим элементом, а два любые подмножества этого множества не могут быть независимыми не нарушая целостность, единство системы.

Автоматизированной информационной системой (АИС) называют организационно-техническую систему, использующую автоматизированные информационные технологии в целях обучения, информационно-аналитического обеспечения научно-инженерных работ и процессов управления. В соответствии с данным определением ГИС попадает в класс автоматизированных информационных систем.

Также особенностью ГИС является то, что она является интегрированной информационной системой. Интегрированные системы построены на принципах интеграции технологий различных систем. Они зачастую применяются настолько в разных областях, что их название часто не определяет все их возможности и функции. По этой причине не следует связывать ГИС с решением задач только геодезии или географии. "ГЕО" в названии геоинформационных систем и технологий определяет объект исследований, а не предметную область использования этих систем. Необходимо рассмотреть место ГИС среди других автоматизированных систем, что требует дать краткую классификацию этих систем. Выбирая различные аспекты рассмотрения автоматизированных информационных систем можно дать различные их различные классификации.

По принадлежности к конкретной предметной области можно подразделить информационные системы на три класса: технические, экономические, информационно-аналитические. К техническим относят автоматизированные системы научных исследований (АСНИ), системы автоматизированного проектирования (САПР), гибкие производственные системы (ГПС), робототехнические комплексы (РТК) и др. Информационно-аналитические автоматизированные системы включают: автоматизированные справочно-информационные системы (АСИС), базы данных (БД), экспертные системы (ЭС), статистические информационные системы (СТИС) и т.п. Примером экономических систем могут служить автоматизированные системы управления (АСУ), бухгалтерские информационные системы (БУ-ИС), банковские информационные системы (БИС), биржевые информационные системы (БИС), маркетинговые информационные системы (МИС) и др.

Особенностью ГИС как интегрированной системы является то, что она интегрирует технологии трех перечисленных выше классов систем: технических, информационно-аналитических и экономических. Следовательно, ГИС могут быть использованы как любая из этих систем.


1.2 Организация данных в ГИС


Тематические данные хранятся в ГИС в виде таблиц, поэтому проблем с их хранением и организацией в базах данных не возникает. Наибольшие проблемы представляет хранение и визуализация графических данных. Основой визуального представления данных при помощи ГИС-технологий служат специальные графические модели. Они подразделяются на векторные и растровые модели. В общем случае модели пространственных (координатных) данных могут иметь векторное или растровое (ячеистое) представление, содержать или не содержать топологические характеристики. Этот подход позволяет классифицировать модели по трем типам: растровая модель; векторная нетопологическая модель; векторная топологическая модель. Все эти модели взаимно преобразуемы. Тем не менее, при получении каждой из них необходимо учитывать их особенности. В ГИС форме представления координатных данных соответствуют два основных подкласса моделей - векторные и растровые (ячеистые или мозаичные). Возможен класс моделей, которые содержат характеристики, как векторов, так и мозаик. Они называются гибридными моделями. Между векторными и растровыми изображениями имеется различие, характерное именно для ГИС. Растровые изображения отображают поля данных, т.е. носят полевой характер. Векторные изображения в ГИС, как правило, отображают геоинформационные объекты, т.е. носят объектный характер.

Если векторная модель дает информацию о том, где расположен тот или иной объект, то растровая - информацию о том, что расположено в той или иной точке территории. Это определяет основное назначение растровых моделей - непрерывное отображение поверхности.

Растровые модели

В растровых моделях дискретизация осуществляется наиболее простым способом - весь объект (исследуемая территория) отображается в пространственные ячейки, образующие регулярную сеть. При этом каждой ячейке растровой модели соответствует одинаковый по размерам, но разный по характеристикам (цвет, плотность) участок поверхности объекта. В ячейке модели содержится одно значение, усредняющее характеристику участка поверхности объекта. В теории обработки изображений эта процедура известна под названием пикселизация.

Основное назначение растровых моделей - непрерывное отображение поверхности. В растровых моделях в качестве атомарной модели используют двухмерный элемент пространства - пиксель (ячейка). Упорядоченная совокупность атомарных моделей образует растр, который, в свою очередь, является моделью карты или геообьекта. Растровые модели позволяют отображать полутона и цветовые оттенки. Как правило, каждый элемент растра или каждая ячейка должны иметь лишь одно значение плотности или цвета. Это применимо не для всех случаев. Например, когда граница двух типов покрытий может проходить через центр элемента растра, элементу дается значение, характеризующее большую часть ячейки или ее центральную точку. Ряд систем позволяет иметь несколько значений для одного элемента растра.

Для растровых моделей существует ряд характеристик: разрешение, ориентация, зоны, значение, положение. Разрешение - минимальный линейный размер наименьшего участка отображаемого пространства (поверхности), отображаемый одним пикселем. Пиксели обычно представляют собой прямоугольники или квадраты, реже используются треугольники и шестиугольники. Более высоким разрешением обладает растр с меньшим размером ячеек. Высокое разрешение подразумевает обилие деталей, множество ячеек, минимальный размер ячеек. Значение - элемент информации, хранящийся в элементе растра (пикселе) или легенде. Положение обычно задается упорядоченной парой координат (номер строки и номер столбца), которые однозначно определяют положение каждого элемента отображаемого пространства в растре.

Проводя сравнение векторных и растровых моделей, отметим удобство векторных для организации и работы со взаимосвязями объектов. Тем не менее, используя простые приемы, например, включая взаимосвязи в таблицы атрибутов, можно организовать взаимосвязи и в растровых системах. Необходимо остановиться на вопросах точности отображения в растровых моделях. В растровых форматах в большинстве случаев неясно, относятся ли координаты к центральной точке пикселя или к одному из его углов. Поэтому точность привязки элемента растра определяют как 1/2 ширины и высоты ячейки.

Растровые модели имеют следующие достоинства:

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

Растровые данные проще для обработки по параллельным алгоритмам и этим обеспечивают более высокое быстродействие по сравнению с векторными;

Некоторые задачи, например создание буферной зоны, много проще решать в растровом виде;

Многие растровые модели позволяют вводить векторные данные, в то время как обратная процедура весьма затруднительна для векторных моделей;

Процессы растеризации много проще алгоритмически, чем процессы векторизации, которые зачастую требуют экспертных решений.

Векторные модели

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

При построении векторных моделей объекты создаются путем соединения точек прямыми линиями, дугами окружностей, полилиниями. Площадные объекты - ареалы задаются наборами линий. Векторные модели используются преимущественно в транспортных, коммунальных, маркетинговых приложениях ГИС.

Системы ГИС, работающие в основном с векторными моделями, получили название векторных ГИС. В реальных ГИС имеют дело не с абстрактными линиями и точками, а с объектами, содержащими линии и ареалы, занимающими пространственное положение, а также со сложными взаимосвязями между ними. Поэтому полная векторная модель данных ГИС отображает пространственные данные как совокупность следующих основных частей: геометрические (метрические) объекты (точки, линии и полигоны); атрибуты - признаки, связанные с объектами; связи между объектами.

Векторные модели (объектов) используют в качестве элементарной модели последовательность координат, образующих линию. Линией называют границу, сегмент, цепь или дугу. Основные типы координатных данных в классе векторных моделей определяются через базовый элемент линия следующим образом. Точка определяется как выродившаяся линия нулевой длины, линия - как линия конечной длины, а площадь представляется последовательностью связанных между собой отрезков. Каждый участок линии может являться границей для двух ареалов либо двух пересечений (узлов). Отрезок общей границы между двумя пересечениями (узлами) имеет разные названия, которые являются синонимами в предметной области ГИС. Специалисты по теории графов предпочитают слову линия термин ребро, а для обозначения пересечения употребляют термин вершина. Национальным стандартом США официально санкционирован термин цепь. В некоторых системах (arclnfo, geodraw) используется термин дуга. В отличие от обычных векторов в геометрии дуги имеют свои атрибуты. Атрибуты дуг обозначают полигоны по обе стороны от них. По отношению к последовательному кодированию дуги эти полигоны именуются левый и правый. Понятие дуги {цепи, ребра) является фундаментальным для векторных ГИС векторные модели получают разными способами. Один из наиболее распространенных - векторизация сканированных (растровых) изображений. Векторизация - процедура выделения векторных объектов с растрового изображения и получение их в векторном формате. Для векторизации необходимо высокое качество (отчетливые линии и контуры) растровых образов. Чтобы обеспечить требуемую четкость линий иногда приходится заниматься улучшением качества изображения.

При векторизации возможны ошибки, исправление которых осуществляется в два этапа:

) корректировка растрового изображения до его векторизации;

) корректировка векторных объектов.

В векторных форматах набор данных определен объектами базы данных. Векторная модель может организовывать пространство в любой последовательности и дает "произвольный доступ" к данным. В векторной форме легче осуществляются операции с линейными и точечными объектами, например, анализ сети - разработка маршрутов движения по сети дорог, замена условных обозначений. В растровых форматах точечный объект должен занимать целую ячейку. Это создает ряд трудностей, связанных с соотношением размеров растра и размера объекта. Что касается точности векторных данных, то здесь можно говорить о преимуществе векторных моделей перед растровыми, так векторные данные могут кодироваться с любой мыслимой степенью точности, которая ограничивается лишь возможностями метода внутреннего представления координат. Обычно для представления векторных данных используется 8 или 16 десятичных знаков (одинарная или двойная точность).


.3 Что ГИС могут сделать для туризма


Пожалуй, главным козырем ГИС является наиболее "естественное" (для человека) представление как собственно пространственной информации, так и любой другой информации, имеющей отношение к объектам, расположенным в пространстве (т.н. атрибутивной информации). Способы представления атрибутивной информации различны: это может быть числовое значение с датчика, таблица из базы данных (как локальной, так и удаленной) о характеристиках объекта, его фотография, или реальное видеоизображение, наконец, звуковая запись.

Таким образом, ГИС могут помочь везде, где используется пространственная информация и информация об объектах, находящихся в определенных местах пространства.

Если же посмотреть на некоторые области и экономический эффект применения ГИС, то они могут делать пространственные запросы и проводить анализ. Способность ГИС проводить поиск в базах данных и осуществлять пространственные запросы позволила многим компаниях заработать миллионы долларов.

Так, например, на создание туристско-ориентированной геоинформационной системы города пинава (pinawa) и окружающих его территорий (канада) было затрачено $82,500 за 3 года, а за один год система приносит $5 000 000.

Гис помогает сократить время получения ответов на запросы клиентов; выявлять территории подходящие для требуемых мероприятий; выявлять взаимосвязи между различными параметрами (например, почвами, климатом и урожайностью с/х культур);


1.4 Предметно ориентированные ГИС


Зачастую имеющие статус государственных, региональные ГИС (regional gis), субрегиональные ГИС и локальные, или местные ГИС (local gis).

Гис различаются предметной областью информационного моделирования, к примеру, городские ГИС, или муниципальные ГИС, МГИС (urban gis), природоохранные ГИС (environmental gis), туристические т.п.

Среди них особое наименование, как особо широко распространенные, получили земельные информационные системы. Проблемная ориентация ГИС определяется решаемыми в ней задачами (научными и прикладными), среди них инвентаризация ресурсов (в том числе кадастр), анализ, оценка, мониторинг, управление и планирование, поддержка принятия решений. Интегрированные ГИС, ИГИС (integrated gis, igis) совмещают функциональные возможности ГИС и систем цифровой обработки изображений (данных дистанционного зондирования) в единой интегрированной среде.

Научные, технические, технологические и прикладные аспекты проектирования, создания и использования ГИС изучаются геоинформатикой.


1.5 Основные концепции информационной визуализации, используемые в ГИС


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

В связи с этим можно рассмотреть набор операций информационной визуализации, состоящий из следующих пунктов:

- общий обзор;

- изменение размера фрагмента (зуминг);

- фильтрация;

-- детализация по запросу;

- установление зависимостей по определенному признаку;

- извлечение данных по заданному признаку;

- сохранение истории (то есть запись последовательности операций).

Общий обзор дает краткий обзор всей совокупности данных. Он также позволяет видеть полную совокупность плюс подробное представление интересующего фрагмента. За счет зуминга можно увеличить или уменьшить масштаб фрагмента изображения, выбранного в общем обзоре. Фильтрация отбрасывает неинтересные элементы, позволяя пользователям управлять содержанием экрана. При детализации пользователь выбирает элемент или группу элементов и получает детальную информацию о них. Для установления зависимости по признаку пользователь назначает некий признак (атрибут), который позволяет отобрать нужные элементы. Упорядочение элементов массива также строится на основе установления связи с некоторыми признаками (дата записи, алфавитный порядок). Извлечение данных по признаку позволяет извлекать подмножество элементов, удовлетворяющих назначенному признаку (возраст, пол, хобби) и работать с ними. И, наконец, сохранение истории позволяет в случае необходимости последовательно отменить ряд предыдущих команд и вернуться к первоначальному состоянию, например, к первичному тексту документа.


1.6 ГИС и мобильные интерфейсы


Мобильные ГИС являются важным компонентом развитых геоинформационных систем и предназначены для применения непосредственно вне помещения. Они объединяют gps-приемник, мобильный компьютер и программное обеспечение, позволяющие определять местоположение на местности, визуализировать пространственные данные, обращаться к географическим базам данных в реальном времени, осуществлять сбор и анализ данных непосредственно на изучаемых в поле объектах. Эти системы быстро развиваются и применяются в широком спектре задач, связанных с работами на местности.

В настоящий период отчетливо наметилась тенденция интеграции спутниковых систем позиционирования с мобильными компьютерами. На базе объединения gps-приемника в одном корпусе с мощным карманным компьютером, работающим под управлением специализированного программного обеспечения, создаются высокоэффективные мобильные ГИС.

. Инструментальные средства разработки


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


2.1 Операционная система Google Android


Система Android - это программный стек для мобильных устройств, который включает операционную систему, программное обеспечение промежуточного слоя (middleware), а также основные пользовательские приложения (e-mail-клиент, календарь, карты, браузер, контакты и др.).

Уровень ядра

Ядро является слоем абстракции между оборудованием и остальной частью программного стека. На этом уровне располагаются основные службы типа управления процессами, распределения памяти и управления файловой системой.

Ядро android основано на ядре Linux 2.6, но сама система Android не является Linux-системой в чистом виде, имеет некоторые отличия и содержит дополнительные расширения ядра, специфичные для Android, - свои механизмы распределения памяти, взаимодействие между процессами и др.

Рисунок 2.1 - Архитектура системы Android


Основные компоненты уровня ядра:

Драйвер межпроцессорного взаимодействия (ipc driver);

Драйвер управления питанием (android power management);

Набор драйверов для оборудования, входящего в состав мобильного устройства.

Рассмотрим теперь кратко основные компоненты ядра android:

Драйвер IPC.

Приложения и службы могут работать в защищенных отдельных процессах, которые должны общаться между собой и иметь доступ к общим данным. Платформа android обеспечивает механизм ipc (inter-process communication), который является основным механизмом взаимодействия между процессами.

Драйвер IPC обеспечивает следующую функциональность:

Взаимодействие процессов;

Создание и обработку пулов потоков в процессах;

Подсчет и отображение ссылок на объекты в других процессах;

Синхронные запросы между процессами.

Управление энергопотреблением.

Система управления энергопотреблением (android power management) разработана на основе стандартного драйвера управления питанием linux, но оптимизирована для мобильных устройств с учетом их специфических особенностей.

Основная функция системы управления энергопотреблением - экономное использование батареи мобильного устройства. Драйвер переводит системы в «спящий режим» с минимальным потреблением мощности процессором, если приложения и службы не используются.

Драйверы оборудования.

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

Уровень библиотек

Следующий уровень над ядром Linux является набором библиотек c/c++ типа openGL, webkit, freetype, ssl, библиотеки поддержки libc, базы данных SQLite и мультимедиабиблиотек (media framework). Системная библиотека базируется на berkeley software distribution (bsd) и разработана для мобильных устройств на основе Linux.

Следующий уровень над ядром Linux включает набор библиотек c/c++, используемых различными компонентами ос. Для разработчиков доступ к функциям этих библиотек реализован через использование application framework - каркаса приложений. Библиотеки этого уровня по своему функциональному назначению можно разделить на следующие группы:

Системная библиотека с;

Менеджер поверхностей;

Функциональные библиотеки с/с++.

Системная библиотека libc.

Компания Google разработала собственную с-библиотеку (libc) - bionic. Это было необходимо по следующим причинам:

Библиотека будет загружаться в каждый процесс и, следовательно, должна иметь маленький размер. Библиотека bionic имеет размер около 200 кбайт, что в два раза меньше размера glibc;

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

библиотека bionic имеет встроенную поддержку важных для android системных служб и регистрацию системных событий. Библиотека bionic не поддерживает определенные функциональности, например исключения с++, и несовместима с gnu libc и стандартом posix.

Менеджер поверхностей.

Система android использует композитный менеджер поверхностей, похожий на compiz (композитный менеджер для x window system, использующий для ускорения 3d-графику opengl). Вместо того чтобы рисовать непосредственно в буфер экрана, команды рисунка входят за кадром в битовые массивы, которые потом объединяются с другими битовыми массивам, чтобы сформировать изображение, которое видит пользователь. Это позволяет системе создавать все виды интересных эффектов, например прозрачные окна и причудливые переходы.

Менеджер поверхностей обрабатывает весь рендеринг поверхностей на фреймовый буфер. Менеджер может объединить 2d- и 3d-поверхности и поверхности от нескольких приложений. Поверхности передаются как буферы компоновкой ipc-запросов. Менеджер поверхностей использует двойную буферизацию, используя транспонирования страницы. Системные интеграторы могут подключать аппаратное 2d-ускорение, используя плагины khronos. Обработка графической информации менеджером поверхностей представлена на рисунке 2.2


Рисунок 2.2 - Обработка графической информации менеджером поверхностей


Функциональные библиотеки.включает ряд библиотек с/с++, используемых различными компонентами системы. Далее приводятся основные функциональные библиотеки системы.

Мультимедиа (media framework). Эти библиотеки ответственны за регистрацию и воспроизведение аудио- и видеоформатов. Основаны на packetvideo opencore и предназначены для поддержки популярных аудио- и видеоформатов (mpeg4, h.264, mp3 и др.).- процессор баз данных, доступный всем приложениям. SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а представляет библиотеку, с которой программа компонуется, и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (api) библиотеки sqlite. Такой подход уменьшает накладные расходы, время отклика и упрощает разработку приложений для работы с данными. Sqlite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа.es - движок для работы с 3d-графикой, основанный на api-версии openGL es 1.0. OpenGL es - это упрощенная версия спецификации openGL, позволяющая мобильным устройствам работать с тяжеловесными в графическом отношении приложениями. Библиотека использует аппаратный 3d-акселератор (если он доступен на этом устройстве) или встроенное высоко оптимизированное трехмерное программное обеспечение для работы с растровой графикой.- библиотека шрифтов, предназначенная для работы с растровыми и векторными шрифтами.- библиотека, предназначенная для функционирования встроенного в android web-браузера. Webkit поддерживает css, javascript, dom, ajax.- движок для работы с 2d-графикой. Android также поддерживает собственную графическую 2d-библиотеку skia, которая написана на языке c и с++ (skia также формирует ядро популярного браузера google chrome).- библиотека предназначена для работы с сокетами, основанная на протоколе ssl: sslv3.0 или tslv1.2.

Среда выполнения

Среда выполнения обеспечивает библиотеки ядра dalvik virtual machine (виртуальная машина dalvik), которые предоставляют требуемую функциональность для java-приложений.virtual machine.

Прикладное программное обеспечение, запускаемое на мобильном устройстве, исполняет виртуальная машина dalvik, которая хоть и является аналогом виртуальной машины java, существенно от нее отличается. Dalvik относится к классу регистровых машин (регистры процессора используются как первичные модули хранения данных), идеально подходящих для работы на процессорах risc-архитектуры, к которым относятся и процессоры arm, применяемые в мобильных устройствах, тогда как стандартная виртуальная машина java компании sun microsystems - стековая. В результате использования регистровой виртуальной машины Google надеется на 30 процентов уменьшить количество команд по сравнению со стековыми машинами.

Созданные с помощью стандартного java-компилятора class-файлы и преобразуются в байт-код dalvik (*.dex) транслятором dx, входящим в состав sdk. Изнутри работающий Android выглядит как набор виртуальных машин dalvik, в каждой из которых исполняется прикладная задача.

Виртуальная машина dalvik, на которой построена вся операционная система Google Android, дает разработчикам приложений удобный механизм для написаний приложений, которым не принципиален объем используемой памяти и мощность процессора.libraries. Включает набор основных библиотек, которые предоставляют функциональность для java. Библиотеки ядра обеспечивают слой API и являются основной платформой разработки java-приложений для Android.

Уровень каркаса приложений.

Уровень каркаса приложений находится на вершине системных библиотек, функциональных библиотек и dalvik vm. На этом уровне находятся основные службы Android для управления жизненным циклом приложений, пакетами, ресурсами и т.д.

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

Службы Android - это службы, которые являются основными для всех приложений, работающих на устройстве. К ним относятся:

Менеджер деятельностей (activity manager) - управляет жизненным циклом приложений и предоставляет систему навигации по истории работы с деятельностями (стеку деятельностей);

Менеджер пакетов (package manager) - управляет установкой и развертыванием пакетов прикладных программ, которые находятся на устройстве;

Менеджер окон (window manager) - сохраняет окна приложения. Если разработчик предусмотрел вывод экрана, а затем переключение на другой экран, первый будет сохранен операционной системой и поставлен в режим ожидания. Это, в свою очередь, позволяет с помощью клавиши <back> мобильного устройства просматривать уже использовавшиеся экраны подобно тому, как это делается в web-браузере;

Менеджер ресурсов (resource manager) - предназначен для доступа к строковым, графическим и другим типам ресурсов;

Контент-провайдеры (content providers) - службы, которые позволяют приложениям получать доступ к данным других приложений, а также предоставлять сторонним приложениям доступ к своим данным;

Система представлений (view system) - система с расширяемой функциональностью, которая служит для создания внешнего вида приложений, включающего такие компоненты, как списки, таблицы, поля ввода, кнопки, встроенный web-браузер и многое другое;

Телефонный менеджер - обеспечивает слой api, контролирующий основную телефонную информацию, такую как сетевой тип и статус подключения, а также предоставляет различные утилиты для управления телефонными номерами;

Менеджер местоположения - навигационные службы, которые позволяют приложениям получать периодические обновления географического местоположения устройства или запускать определенное приложение;

Менеджер уведомлений - позволяет любому приложению отображать пользовательские уведомления в строке состояния.

Уровень приложений

Мобильное устройство Android поставляется с набором основных приложений, включая почтового клиента, программу для работы с sms, календарь, навигационные карты, браузер, контакты и др.

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

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




. Описание проекта приложения


3.1 Структура программы


Одним из компонентов android-приложения является деятельность (activity). Деятельность представляет собой визуальный пользовательский интерфейс для приложения - окно. Как правило, окно полностью заполняет экран мобильного устройства, но может иметь размеры меньше чем у экрана. Деятельность может также использовать дополнительные окна, например всплывающее диалоговое окно, которое запрашивает пользовательский ответ для основной деятельности, или окно уведомления о каком-либо событии в приложении или системе. Приложение может содержать несколько деятельностей. Каждая деятельность независима от других. При открытии новой деятельности работа предыдущей приостанавливается, а сама она вносится и сохраняется в стек деятельностей.

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

На рисунке 2.3 показано дерево взаимодействия activities (деятельностей) программы.

Рисунок 2.3 - Дерево взаимодействия activities (деятельностей) программы


.2 Описание компонентов программы


На платформе android необходимо определить пользовательский интерфейс для каждой деятельности, используя иерархии узлов view и viewgroup, как показано на рисунке 2.4.

Объекты view - основные модули отображения интерфейса пользователя на платформе android. Объект view - структура данных свойства которой сохраняют параметры разметки и содержание для определенной прямоугольной области экрана. Как объект в интерфейсе пользователя, объект view является точкой взаимодействия пользователя и программы.

Класс viewgroup служит ядром для подклассов, называемых разметками (layouts), которые формируют расположение элементов пользовательского интерфейса на форме, использую различные виды архитектуры разметки - фреймовый, линейный, табличный и относительный.


Рисунок 2.4 - Пример дерева представлений для деятельностей


Главная деятельность (Main Menu)

Рассмотрим структуру главной деятельности. Внешний вид окна представлен на рисунке 2.5.


Рисунок 2.5 - Главное окно программы

Рисунок 2.6 отображает иерархию разметки главного окна программы и её свойства.


Рисунок 2.6 - Иерархия разметки главного окна.


Как видно из рисунка 2.7 конечными элементами разметки, которые видит пользователь, являются следующие элементы: текстовое поле (title), 3 кнопки (button_map, button_poi, button_exit).


Рисунок 2.7 - Элементы разметки

При нажатии на кнопку <map> открывается активити содержащую карту Google map.

При нажатии на кнопку <poi> открывается активити содержащее список команд приложения.

При нажатии на кнопку <exit> программа закрывается.

Деятельность map

Рассмотрим структуру деятельности map. Внешний вид окна представлен на рисунке 2.8.


Рисунок 2.8 - Окно map


Рисунок 2.9 отображает иерархию разметки окна map.

Рисунок 2.9 - Иерархия разметки окна map


При нажатии на кнопку <poi> мобильного устройства, на экране появляется меню из четырех пунктов poi, add objects, search, exit.

При выборе пункта poi открывается активити, содержащее команду Stage (Остановки).

На рисунке 2.10 можно увидеть, что при выборе пункта add objects открывается всплывающее окно с кнопкой <search by stage>


Рисунок 2.10 - Всплывающее меню search


При нажатии на кнопку <Search by Stage> открывается форма, содержащая поле (stage) и две кнопки (Ok и Cancel) . При нажатии на кнопку Ok на карте отображается маркер, соответствующей остановке, это можно увидеть на рисунке 2.11.

Рисунок 2.11 Поиск по остановке


При выборе пункта меню exit программа закрывается.

Деятельность poi

Рассмотрим структуру деятельности poi. Внешний вид окна представлен на рисунке 2.12.

Рисунок 2.12 - Окно poi


Рисунок 2.13 отображает иерархию разметки окна poi.


Рисунок 2.13 - Иерархия разметки окна poi

Как видно из рисунка конечными элементами разметки, которые видит пользователь, является список listview содержащий текстовое поле с названием объекта.

При выборе элемента Stage открывается активити stageviewactivity, содержащее список всех объектов выбранной группы.

Деятельность StageViewActivity

Рассмотрим структуру деятельности StageViewActivity. Внешний вид окна представлен на рисунке 2.14.


Рисунок 2.14 - Окно StageViewActivity


Рисунок 2.15 отображает иерархию разметки окна StageViewActivity.

Рисунок 2.15 - Иерархия разметки окна StageViewActivity


Как видно из рисунка конечными элементами разметки, которые видит пользователь, является список listview содержащий текстовые поля с расписанием транспорта. Это мы можем увидеть на рисунке 2.16.

Рисунок 2.16 - Расписание транспорта StageViewActivity


На рисунке 2.17 мы видим, что при нажатии на кнопку <View on MAP> мы переходим на карту, где обозначена наша остановка.


Рисунок 2.17 - Подсказка с местонахождением остановки


.3 Программная реализация


Компоненты приложения имеют жизненный цикл - начало, когда Android инициализирует их, активный период работы, неактивный период, когда они бездействуют, и конец, когда компоненты уничтожаются и освобождают ресурсы для запуска других компонентов.

Прежде чем Android запустит компонент приложения, он должен узнать, что этот компонент существует. Поэтому приложения объявляют свои компоненты в файле манифеста AndroidManifest.xml, который представляет основную информацию системе.

Структура файла AndroidManifest.xml

Элемент <manifest> является корневым элементом файла.

<manifest xmlns:android=

"#"justify">android:versionname="1.0.">

Элемент <uses-sdk> позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android. Уровень api, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.

<uses-sdk android:minsdkversion="8" />

версия sdk означает, что приложение будет откомпилировано с использованием библиотек android 2.2.

Элемент <uses-permission> запрашивает разрешения, которые приложению должны быть предоставлены системой для его нормального функционирования.

Использование доступа к интернету:

<uses-permission android:name="android.permission.internet" />

Разрешение приложению доступа к данным о местоположении, предоставляемым сетью wi-fi или сотовой сетью, которые получаются через класс geolocation:

<uses-permission android:name="android.permission.access_coarse_location" />

Разрешает приложению доступ к данным gps через класс geolocation.

<uses-permission android:name="android.permission.access_fine_location" />

Элемент <application> - это элемент манифеста, содержащий описание компонентов приложения, доступных в пакете. Этот элемент содержит дочерние элементы, которые объявляют каждый из компонентов, входящих в состав приложения.

Элемент <activity> объявляет деятельность. Все деятельности должны быть явно представлены отдельными элементами <activity> в файле манифеста.

Пример задания деятельности:

<activity android:name=".activities.mapsactivity":label="map" />


<activity android:name=".activities.objectseditoractivity":label="objects">

</activity>

элемент <provider> объявляет контент-провайдера.

Пример задания контент-провайдера:

<provider android:name=".providers.objectviewprovider":authorities="com.touristmap.objectviewprovider">

</provider>

Элемент <uses-library> определяет общедоступную библиотеку, с которой должно быть связано приложение.

<uses-library android:name="com.google.android.maps" />

Каталог ресурсов

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

Подкаталог res/layout/

В эту папку помещаются файлы разметки.

Файлы разметки.

Разметка - это архитектура расположения элементов интерфейса пользователя для конкретного окна, представляющего деятельность. Самый общий способ определять разметку и создавать иерархию представления - в xml-файле разметки. Преимущество объявления пользовательского интерфейса в xml-файле состоит в том, что это дает возможность определить представление приложения от программного кода, который управляет поведением приложения. Общая структура xml-файла - это дерево xml элементов, где каждый узел представляет имя класса view.

Файл main.xml

Файл main.xml является файлом разметки для главного активити MainActivity. Корневым элементом данного файла является <tablelayout>


<tablelayout xmlns:android="#"justify">android:orientation="vertical":layout_width="fill_parent":layout_height="fill_parent">


У данного элемента существует 3 дочерних элемента <button>

<button :id="@+id/button_map":text="map":layout_width="wrap_content":layout_height="wrap_content/>


Каждый из этих элементов имеет атрибуты, определяющие свойства данного элемента. Например: :id="@+id/button_map" - определяет идентификатор объекта, по которому связывается объект из файла разметки с объектом view в коде программы. Символ + (@+id) означает, что это новое имя ресурса, которое должно быть создано и добавлено к ресурсам в файл r.java, который среда android автоматически генерирует для проекта.

Файлы map.xml, object_info.xml, object_menu.xml, object_view.xml, objects.xml, search_stage.xml, , search_menu.xml, search.xml устроены аналогичным образом.

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


Public void onCreate(Bundle savedinstancestate) {

super.onCreate(savedinstancestate);(R.layout.main);


Подкаталог res/drawable/

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

Подкаталог res/values/

В данной папке хранятся общие константы для всего приложения: текст используемый элементами управления. Например:


<string name="app_name">TMap</string>


Файлы деятельностей

Каждый файл деятельности содержит класс, в который добавляется код, реализующий логику работы приложения в данной деятельности. В каждом из таких классов обязательно определяется метод обратного вызова onCreate(), который вызывается системой для прорисовывания окна деятельности на экране устройства.

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


final Button button_map = (Button) findViewById (R.id.button_map);_map.setOnClickListener(new View.OnClickListener() {


@Overridevoid onClick(View v) {mapsActivity = new Intent(MainActivity.this,MapsActivity.class);

startActivity(mapsActivity);

}

});


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

Файл MapsActivity.java описывает функционал для работы с картой:

Отображение карты (получение контроля над картой, определение вида отображения карты, добавление кнопок масштабирования, загрузка слоев)


super.onCreate(savedInstanceState);(R.layout.map);= (MapView) findViewById(R.id.mapView);= myMapView.getController();.setStreetView(true);.setBuiltInZoomControls(true);= myMapView.getOverlays();.setCenter(START_POINT);.setZoom(12);mapOverlay = new MapOverlay();<Overlay> listOfOverlays = myMapView.getOverlays();.clear();.add(mapOverlay);


Создание всплывающего меню в процедуре onCreateOptionsMenu(Menu menu). Создание обработчика событий выбора пункта меню onOptionsItemSelected(MenuItem Item).

Создание всплывающих диалогов поиска и добавления объектов на карту.

Процедура добавления объектов на карту AddGroup(Uri uri, Drawable drawable)

Процедура добавления точки на карту isAddLocationPoint(double netlat, double netlng, String name)

Процедуры вызова диалогов поиска CallSearchAddressDialog(), CallSearchCoordDialog()

В файле ObjectsEditorActivity.java описывается функциональность окна poi:

Создается список объектов

Создание обработчика событий выбора элементов, а именно переходы на новые активити содержащие списки объектов данной группы.

В файле StageViewActivity.java описывается функциональность окна stage:

Создается список объектов, данные о которых берутся из соответствующей базы данных

Создание обработчика событий выбора элементов списка

Процедура добавления объекта на карту CallViewOnMap()

Процедура отображения диалога с информацией об объекте CallObjectInfoDialog().

Вспомогательные файлы для работы с базой данных

Рассмотрим структуру данных файлов на примере ObjectDbHelper.java. Класс ObjectDbHelper, расширяющий класс SQLiteOpenHelper представляет таблицу object базы данных. В нем объявлена структура таблицы и в методе onCreate() производится создание таблицы и заполнение её текстовыми данными при первом запуске приложения на устройстве.


public void onCreate(SQLiteDatabase db){.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+ NAME + " TEXT, " + ADDRESS + " TEXT, " + LAT + " TEXT, " + LON + " TEXT);");values = new ContentValues();

.put(NAME, "универмаг «Гомель»");.put(LAT, " 52.43921");.put(LON, "31.003246 ");.insert(TABLE_NAME, NAME, values);


Провайдеры

Рассмотрим структуру провайдера на примере файла класса провайдера ObjectViewProvider.java.

Класс ObjectViewProvider данного файла расширяющий базовый класс ContentProvider представляет логику доступа к содержимому базы данных object.

В методе обратного вызова onCreate() который вызывается системой при создании экземпляра ContentProvider, инициализируется объект SQLiteDatabase.

private SQLiteDatabase db;

@Overrideboolean onCreate() {

= (new ObjectDbHelper(getContext())).getWritableDatabase();(db == null) ? false : true;

}

Метод query(Uri url, String[] projection, selection, String[] selectionArgs, String sort)

Реализуется запрос к бд.

Метод insert(Uri url, ContentValues inValues) используется для вставки данных и возвращает клиенту контент-провайдера Uri вставляемой строки.

Метод update(Uri url, ContentValues values, where, String[] whereArgs) реализует модификацию данных, а метод delete(Uri url, String where, string[] whereArgs) - удаление данных.





Заключение


Подведем итоги нашей работы. Была поставлена задача создания приложения для мобильных устройств, работающих на платформе Android, которое помогало бы туристам и жителям города Гомеля передвигаться на общественном транспорте. Основной идеей было создание специализированной активной карты с послойной организацией географических данных на данной карте. Разработан прототип программы, реализующий нашу идею. Программа представляет собой «электронный помощник» туриста, а также жителя города, используя который он может с легкостью передвигаться по городу и заранее знать, когда расписание городского транспорта. На следующем этапе необходимы консультации со специалистами в области туризма и аккуратное опробование на реальных пользователях.

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

Создание локальной карты города, с которой можно работать без подключения к интернету;

Добавление возможности редактирования и сохранения информации о транспортных средствах и остановок в базе данных;

Расширение базы данных транспортных средства и остановок;

Расширение файла связи адресов и географических координат;

Добавление маршрутов для пользователей;

Локализация программы на различные языки;

информационный мобильный интерфейс карта




Литература


Ципилева Т.А. - Геоинформационные системы.

<#"justify">Приложение


Файл AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="#"justify"><uses-sdk android:minSdkVersion="8" />


<application android:icon="@drawable/icon" android:label="@string/app_name">

<provider android:name=".providers.ObjectViewProvider":authorities="com.tmap.ObjectViewProvider">

</provider>

<provider android:name=".providers.StageProvider":authorities="com.tmap.StageProvider">

</provider>

<provider android:name=".providers.transportProvider":authorities="com.touristmap.transportProvider">

</provider>

<provider android:name=".providers.routeProvider":authorities="com.tmap.routeProvider">

</provider>


<uses-library android:name="com.google.android.maps" />


<activity android:name=".activities.MainActivity":label="TMap MainMenu":launchMode="singleTask">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>


<activity android:name=".activities.MapsActivity":label="Map" />


<activity android:name=".activities.ObjectsEditorActivity":label="Objects">

</activity>

<activity android:name=".activities.StageViewActivity":label="@string/title_view">

</activity>

<activity android:name=".activities.ViewObjectOnMapActivity":label="@string/title_view">

</activity>

</application>

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


</manifest>


Файл MainActivity.javacom.tmap.activities;com.tmap.R;android.app.Activity;android.app.AlertDialog;android.content.Context;android.content.DialogInterface;android.content.Intent;android.location.LocationManager;android.os.Bundle;android.provider.Settings;android.view.View;android.widget.Button;

class MainActivity extends Activity {


/** Called when the activity is first created. */

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);(R.layout.main);locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

AlertDialog.Builder builder = new AlertDialog.Builder(this);.setMessage("GPS выключен")

.setCancelable(false)

.setPositiveButton("Настройки GPS", new DialogInterface.OnClickListener() {void onClick(final DialogInterface dialog, final int id) {intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);(intent, 1);

}

})

.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {void onClick(final DialogInterface dialog, final int id) {();

}

});AlertDialog alert = builder.create();.show();

}

Button button_map = (Button) findViewById (R.id.button_map);_map.setOnClickListener(new View.OnClickListener() {


@Overridevoid onClick(View v) {mapsActivity = new Intent(MainActivity.this,MapsActivity.class);(mapsActivity);


}

});

Button button_settings = (Button) findViewById (R.id.button_poi);_settings.setOnClickListener(new View.OnClickListener() {


@Overridevoid onClick(View v) {objectsEditorActivity = new Intent(MainActivity.this,ObjectsEditorActivity.class);(objectsEditorActivity);

}

});

Button button_exit = (Button) findViewById (R.id.button_exit);_exit.setOnClickListener(new View.OnClickListener() {


@Overridevoid onClick(View v) {();

}

});

}

}


Файл map.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout :android="#"justify"><com.google.android.maps.MapView:id="@+id/mapView":layout_width="fill_parent":layout_height="fill_parent":enabled="true":clickable="true":apiKey="0GJi6BBZP0bHZdweHL03Lq1vTlpaVxMqpoZrqMQ"

/>

</LinearLayout>


Файл MapsActivity.javacom.touristmap.activities;android.net.Uri;android.os.Bundle;com.touristmap.DirectionPathOverlay;com.touristmap.HelloItemizedOverlay;com.touristmap.MyPositionOverlay;com.tmap.ObjectDbHelper;com.tmap.R;com.google.android.maps.GeoPoint;com.google.android.maps.MapActivity;com.google.android.maps.MapController;com.google.android.maps.MapView;com.google.android.maps.Overlay;com.google.android.maps.OverlayItem;com.touristmap.activities.MapsActivity;com.touristmap.providers.StageProvider;com.touristmap.providers.TransportProvider;com.touristmap.providers.RouteProvider;com.touristmap.providers.ObjectViewProvider;com.touristmap.providers.TemplesProvider;android.app.AlertDialog;android.app.Dialog;android.content.Context;android.content.DialogInterface;android.content.Intent;android.database.Cursor;android.graphics.drawable.Drawable;android.location.Address;android.location.Criteria;android.location.Geocoder;android.location.Location;android.location.LocationListener;android.location.LocationManager;android.view.LayoutInflater;android.view.Menu;android.view.MenuItem;android.view.MotionEvent;android.view.View;android.view.View.OnClickListener;android.widget.Button;android.widget.EditText;android.widget.Toast;java.io.BufferedReader;java.io.BufferedWriter;java.io.FileInputStream;java.io.FileOutputStream;java.io.IOException;java.io.InputStreamReader;java.io.OutputStreamWriter;java.util.*;

class MapsActivity extends MapActivity {mapController;positionOverlay;String[] street;int[] house;double[] lath;double[] lonh;int sizeSTR=-1;String streetIsc="ленина";int houseIsc = 47;double latIsc=0;double lonIsc=0;static final int IDM_SETTINGS = 101;static final int IDM_ADD_OBJ = 102;static final int IDM_ADD_ROUTE = 103;static final int IDM_PATH_TEST = 104;static final int IDM_SEARCH = 105;static final int IDM_EXIT = 106;final static int IDD_OBJECTS = 0;final static int IDD_ADD_TOURIST_ROUTE = 1;final static int IDD_COLLECT_ROUTE=2;CharSequence[] mObjects = { "Stage", "Transport", "Route" };boolean[] mCheckedObjItems = { false, false, false };boolean[] mCheckedPathItems = { false, false, false };CharSequence[] mRouteObj = { "Авторемонтный завод", "7", "Мик. Кленковский - Вокзал" };boolean[] mCheckedRouteObjItems = { false, false, false};static final String[] mCoord = new String[] { ObjectDbHelper._ID,.NAME, ObjectDbHelper.LAT, ObjectDbHelper.LON };static String NLAT = "nlat";static String NLNG = "nlng";<Overlay> mapOverlays;itemizedOverlay;myMapView;lat;lng;double[] latiC;double[] longC;String[] nameC;stage;transport;route;path = "/mnt/sdcard/OutCoord.txt";coord = "/mnt/sdcard/coord.txt";in = "/mnt/sdcard/in.txt";out = "/mnt/sdcard/out.txt";out_coord = "/mnt/sdcard/OutCoord.txt";int[][] A;int s, t;int size = -1;[] d;Stack<Integer> st;Stack<Integer> st1;int stackSize = 0;LinkedList<Integer> l = new LinkedList<Integer>();


/** Called when the activity is first created. */

@Overridevoid onCreate(Bundle savedInstanceState) {

.onCreate(savedInstanceState);(R.layout.map);= (MapView) findViewById(R.id.mapView);= myMapView.getController();.setStreetView(true);.setBuiltInZoomControls(true);= myMapView.getOverlays();.setCenter(START_POINT);.setZoom(12);


// Добавляем маркер своего местоположения= new MyPositionOverlay();<Overlay> overlays = myMapView.getOverlays();.add(positionOverlay);

= getResources().getDrawable(R.drawable.h_stage);= getResources().getDrawable(R.drawable.h_transport);= getResources().getDrawable(R.drawable.h_route);= locationManager;context = Context.LOCATION_SERVICE;= (LocationManager) getSystemService(context);

criteria = new Criteria();.setAccuracy(Criteria.ACCURACY_FINE);.setAltitudeRequired(false);.setBearingRequired(false);.setCostAllowed(true);.setPowerRequirement(Criteria.POWER_LOW);provider = locationManager.getBestProvider(criteria, true);

location = locationManager.getLastKnownLocation(provider);

(location);.requestLocationUpdates(provider, 1500, 3,);


}


@Overrideboolean onCreateOptionsMenu(Menu menu) {.add(Menu.NONE, IDM_SETTINGS, Menu.NONE, "POI")

.setAlphabeticShortcut('p');.add(Menu.NONE, IDM_ADD_OBJ, Menu.NONE, "Add objects")

.setAlphabeticShortcut('a');.add(Menu.NONE, IDM_ADD_ROUTE, Menu.NONE, "Route")

.setAlphabeticShortcut('r');.add(Menu.NONE, IDM_SEARCH, Menu.NONE, "Search")

.setAlphabeticShortcut('s');.add(Menu.NONE, IDM_EXIT, Menu.NONE, "Exit").setAlphabeticShortcut(

'x');(super.onCreateOptionsMenu(menu));

}


@Overrideboolean onOptionsItemSelected(MenuItem item) {(item.getItemId()) {IDM_SETTINGS:objectsEditorActivity = new Intent(MapsActivity.this, ObjectsEditorActivity.class);(objectsEditorActivity);.setChecked(true);;IDM_ADD_OBJ:(IDD_OBJECTS);.setChecked(true);;IDM_SEARCH:inflater = LayoutInflater.from(this);root = inflater.inflate(R.layout.search_menu2, null);Button button_addr = (Button) root.findViewById(R.id.button_addr);Button button_coord = (Button) root.findViewById(R.id.button_coord);_addr.setText("Search by stage");.Builder menu = new AlertDialog.Builder(this);.setView(root);.show();

_addr.setOnClickListener(new OnClickListener() {

@Overridevoid onClick(View v) {();

};

});_coord.setOnClickListener(new OnClickListener() {


@Overridevoid onClick(View v) {();


};


});.setChecked(true);;IDM_EXIT:.exit(0);;:false;

}

true;

}


@OverrideDialog onCreateDialog(int id) {(id) {IDD_OBJECTS:.Builder builderObj = new AlertDialog.Builder(this);.setTitle("Add objects");.setMultiChoiceItems(mObjects, mCheckedObjItems, new DialogInterface.OnMultiChoiceClickListener() {

@Overridevoid onClick(DialogInterface dialog, int which, boolean isChecked) {[which] = isChecked;

}

});

.setPositiveButton("OK", new DialogInterface.OnClickListener() {void onClick(DialogInterface dialog, int id) {(!mapOverlays.isEmpty()) {.clear();

} else {(mCheckedObjItems[0]) {(ObjectViewProvider.CONTENT_URI, theatres);

}

(mCheckedObjItems[1]) {(StageProvider.CONTENT_URI, museams);

}(mCheckedObjItems[2]) {(TransportProvider.CONTENT_URI, monuments);

}(mCheckedObjItems[3]) {(RouteProvider.CONTENT_URI, interestObjects);

}(mCheckedObjItems[4]) {

}

}

});

.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {void onClick(DialogInterface dialog, int id) {.cancel();.makeText(getApplicationContext(), "Dialog cancel", Toast.LENGTH_SHORT).show();

}

});

.setCancelable(false);builderObj.create();



// Процедура Добавления объекта на картуvoid addGroup(Uri uri, Drawable drawable) {cursor = managedQuery(uri, mCoord, "_ID", null, null);count = cursor.getCount();= new double[count];= new double[count];= new String[count];(int i = 0; i < count; i++) {[i] = -1;[i] = -1;[i] = "";

}

(int i = 0; i < count; i++) {.moveToPosition(i);= Double.parseDouble(cursor.getString(2));= Double.parseDouble(cursor.getString(3));[i] = lat;[i] = lng;[i] = cursor.getString(1);

}nl, nlg;= new HelloItemizedOverlay(this, drawable);

{(int i = 0; i < count; i++) {= latiC[i];= longC[i];name = nameC[i];(nl, nlg, name);

}

} catch (NullPointerException e) {.printStackTrace();

}

}


// Процедура добавления точки на картуvoid isAddLocationPoint(double netlat, double netlng, String name) {

point = new GeoPoint((int) (netlat * 1E6),

(int) (netlng * 1E6));coord = "Широта: " + netlat + "\nДолгота: " + netlng;

// Создаем точку и текст появляющийся при нажатии

OverlayItem overlayitem = new OverlayItem(point, name, coord);

// Положение карты при запуске в точке point

mapController.animateTo(point);.setZoom(13);


// Добавляем точку на карту.addOverlay(overlayitem);

mapOverlays.add(itemizedOverlay);


}


//Процедура поиска по остановкам

private void CallSearchAddressDialog() {inflater = LayoutInflater.from(this);root = inflater.inflate(R.layout.search_address, null);EditText textStreet = (EditText)root.findViewById(R.id.street);EditText textHouse = (EditText)root.findViewById(R.id.house);

.Builder b = new AlertDialog.Builder(this);.setView(root);.setTitle("Search by Stage");.setPositiveButton(

"Ок", new DialogInterface.OnClickListener() {

void onClick(DialogInterface dialog, int whichButton) {street = textStreet.getText().toString();house = Integer.parseInt(textHouse.getText().toString()); ();(st, n);(latIsc!=0 & lonIsc !=0 ){text = "Широта: " + latIsc + "\nДолгота: "

+ lonIsc;.makeText(getBaseContext(), text, Toast.LENGTH_SHORT).show();= new HelloItemizedOverlay(null, getResources().getDrawable(R.drawable.androidmarker));(latIsc, lonIsc, "Искомая точка");

}{ErrMsg = "wrong!";.makeText(getBaseContext(), ErrMsg, Toast.LENGTH_SHORT).show();

}

}

});.setNegativeButton(

"Cancel", new DialogInterface.OnClickListener() {void onClick(DialogInterface dialog, int whichButton) {}

});.show();

}

void CallSearchCoordDialog() {inflater = LayoutInflater.from(this);root = inflater.inflate(R.layout.search_coord, null);

EditText textLatitude = (EditText)root.findViewById(R.id.latitude);EditText textLongitude = (EditText)root.findViewById(R.id.longitude);

.Builder b = new AlertDialog.Builder(this);.setView(root);.setTitle("Search by coordinates");.setPositiveButton(

"Ок", new DialogInterface.OnClickListener() {

void onClick(DialogInterface dialog, int whichButton) {sslat = textLatitude.getText().toString();sslon = textLongitude.getText().toString();slat = Double.parseDouble(sslat);slon = Double.parseDouble(sslon);SearchCoord = getResources().getDrawable(R.drawable.androidmarker);= new HelloItemizedOverlay( null, SearchCoord);(slat,slon,"искомая точка");

}

});.setNegativeButton(

"Cancel", new DialogInterface.OnClickListener() {void onClick(DialogInterface dialog, int whichButton) {}

});.show();

}

//Процедура считывания данных для поиска

private void ReadInTxtSearch()

{

{ibr = new BufferedReader(InputStreamReader(FileInputStream("/mnt/sdcard/insearch.txt"),"windows-1251"));

str;scanner;[] vr;=Integer.parseInt(ibr.readLine());= new String [sizeSTR];= new int [sizeSTR];= new double [sizeSTR];= new double [sizeSTR];= new String [4];a;(int i = 0; i<sizeSTR; i++)

{[i]=-1000;[i]=-1000;[i]=" ";[i]=-1;

}(int i = 0; i<sizeSTR; i++)

{(int j=0;j<4;j++)

{[j]="";

}=0;=ibr.readLine();= new Scanner(str); (scanner.hasNext())

{[a]=scanner.next();=a+1;

}[i]=vr[0];[i]=Integer.parseInt(vr[1]);[i]=Double.parseDouble(vr[2]);[i]=Double.parseDouble(vr[3]);

}.close();

}(IOException ae){}

};


private void searchadress(String stIsc, int nIsc)

{= streetIsc.toLowerCase();fl=0, ch=0;((fl==0) & (ch<sizeSTR))

{((streetIsc.equals(st [ch])) & (nIsc == house[ch]))

{= lath[ch];= lonh[ch];=1;

}=ch+1;

}


}}


Файл ObjectsEditorActivity.javacom.tmap.activities;

com.tmap.R;android.os.Bundle;android.app.ListActivity;android.content.Intent;android.view.View;android.widget.ArrayAdapter;android.widget.ListView;

class ObjectsEditorActivity extends ListActivity {

/** Called when the activity is first created. */int mId = -1;[] mObjectsClass = { "Stage", "Transport", "Route" };

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);(R.layout.objects);(new ArrayAdapter<String>(this,.R.layout.simple_list_item_1, mObjectsClass));

}

void onListItemClick(ListView parent, View v, int position, long id) {= position;(mId) {0: {intent = new Intent();.setClass(this, StageViewActivity.class);(intent);

};1: {intent = new Intent();.setClass(this, TransportViewActivity.class);(intent);

};2: {intent = new Intent();.setClass(this, RouteViewActivity.class);(intent);

};3: {intent = new Intent();.setClass(this, ;

}

}


}


Файл StageViewActivity.javacom.tmap.activities;

com.tmap.ObjectDbHelper;com.tmap.R;com.tmap.providers.ObjectViewProvider;android.os.Bundle;android.app.AlertDialog;android.app.ListActivity;android.database.Cursor;android.view.LayoutInflater;android.view.View;android.view.View.OnClickListener;android.widget.Button;android.widget.ListView;android.widget.TextView;android.widget.ListAdapter;android.widget.SimpleCursorAdapter;android.widget.Toast;android.content.Intent;class StageViewActivity extends ListActivity {Cursor mCursor;ListAdapter mAdapter;String netlat;String netlng;lat;lng;


private static final String[] mContent = new String[] { ObjectDbHelper._ID,.NAME, ObjectDbHelper.ADDRESS };

static final String[] displayContent = new String[] {.NAME, ObjectDbHelper.ADDRESS };

[] displayViews = new int[] { R.id.ObjectName, R.id.ObjectAddress };

int infId;



static final String[] mCoord = new String[] { ObjectDbHelper._ID,.LAT, ObjectDbHelper.LON };


@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);

= managedQuery(ObjectViewProvider.CONTENT_URI, mContent, null,, null);= new SimpleCursorAdapter(this, R.layout.object_view, mCursor,, displayViews);(mAdapter);

}void onListItemClick(ListView parent, View v, int position, long id) {= position;

cursor = managedQuery(ObjectViewProvider.CONTENT_URI, mCoord,

"_ID", null, null);.moveToPosition(position);text = "Широта: " + cursor.getString(1) + "\nДолгота: "

+ cursor.getString(2);.makeText(this, text, Toast.LENGTH_SHORT).show();= cursor.getString(1);= cursor.getString(2);

inflater = LayoutInflater.from(this);root = inflater.inflate(R.layout.object_menu, null);Button button_add = (Button) root.findViewById(R.id.button_add);Button button_info = (Button) root.findViewById(R.id.button_info);Button button_route = (Button) root.findViewById(R.id.button_route);_add.setText("Add on Map");_info.setText("Information");_route.setText("Construct a route");.Builder menu = new AlertDialog.Builder(this);.setView(root);.show();

_info.setOnClickListener(new OnClickListener() {

@Overridevoid onClick(View v) {();

};


});

_add.setOnClickListener(new OnClickListener() {

@Overridevoid onClick(View v) {();


};

});_route.setOnClickListener(new OnClickListener() {

@Overridevoid onClick(View v) {



};

});


}void CallViewOnMap(){

intent = new Intent();.setClass(this, ViewObjectOnMapActivity.class);.putExtra(MapsActivity.NLAT, netlat);.putExtra(MapsActivity.NLNG, netlng);(intent);();

}


private void CallObjectInfoDialog() {inflater = LayoutInflater.from(this);root = inflater.inflate(R.layout.object_info, null);TextView textName = (TextView) root.findViewById(R.id.name);TextView textPhone = (TextView) root.findViewById(R.id.address);

.moveToPosition(infId);.setText(mCursor.getString(1));.setText(mCursor.getString(2));

.Builder b = new AlertDialog.Builder(this);.setView(root);.show();

}


}


Файл ObjectViewProvider.javacom. tmap.providers;

java.util.HashMap;com.touristmap.ObjectDbHelper;android.content.ContentProvider;android.content.ContentUris;android.content.ContentValues;android.content.UriMatcher;android.database.Cursor;android.database.SQLException;android.database.sqlite.SQLiteDatabase;android.net.Uri;android.text.TextUtils;

class ObjectViewProvider extends ContentProvider {static final String DB_OBJECTS = "objects.db";static final Uri CONTENT_URI = Uri.parse("content://com.touristmap.ObjectViewProvider/object");static final int URI_CODE = 1;static final int URI_CODE_ID = 2;static final UriMatcher mUriMatcher;static HashMap<String, String> mObjectMap;SQLiteDatabase db;

{= new UriMatcher(UriMatcher.NO_MATCH);.addURI("com.tmap.ObjectViewProvider", .TABLE_NAME, URI_CODE);.addURI("com.tmap.ObjectViewProvider", .TABLE_NAME + "/#", URI_CODE_ID);

= new HashMap<String, String>();.put(ObjectDbHelper._ID, ObjectDbHelper._ID);.put(ObjectDbHelper.NAME, ObjectDbHelper.NAME);.put(ObjectDbHelper.ADDRESS, ObjectDbHelper.ADDRESS);.put(ObjectDbHelper.LAT, ObjectDbHelper.LAT);.put(ObjectDbHelper.LON, ObjectDbHelper.LON);

}String getDbName() {(DB_OBJECTS);

}


@Overrideboolean onCreate() {= (new ObjectDbHelper(getContext())).getWritableDatabase();(db == null) ? false : true;

}


@OverrideCursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sort) {

orderBy; (TextUtils.isEmpty(sort)) {= ObjectDbHelper.NAME;

} {= sort;

}

c = db.query(ObjectDbHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, orderBy);.setNotificationUri(getContext().getContentResolver(), url);c;

}


@OverrideUri insert(Uri url, ContentValues inValues) {values = new ContentValues(inValues);

rowId = db.insert(ObjectDbHelper.TABLE_NAME, ObjectDbHelper.NAME, values);(rowId > 0) {uri = ContentUris.withAppendedId(CONTENT_URI, rowId);().getContentResolver().notifyChange(uri, null);uri;

}{new SQLException("Failed to insert row into " + url);

}

}


@Overrideint delete(Uri url, String where, String[] whereArgs) {retVal = db.delete(ObjectDbHelper.TABLE_NAME, where, whereArgs);

().getContentResolver().notifyChange(url, null);retVal;

}


@Overrideint update(Uri url, ContentValues values, where, String[] whereArgs) {retVal = db.update(ObjectDbHelper.TABLE_NAME, values, where, whereArgs);

().getContentResolver().notifyChange(url, null);retVal;

}


@OverrideString getType(Uri uri) { null;

}

}




Файл ObjectDbHelper.javacom.tmap;

//музеиcom.tmap.providers.ObjectViewProvider;android.content.ContentValues;android.content.Context;android.database.Cursor;android.database.SQLException;android.database.sqlite.SQLiteDatabase;android.database.sqlite.SQLiteOpenHelper;android.provider.BaseColumns;

class ObjectDbHelper extends SQLiteOpenHelper implements BaseColumns{static final String TABLE_NAME="object";static final ="latitude";static final String NAME="name";static final String ADDRESS="address";static final String LON="longitude";SQLiteDatabase db;final Context mCtx;ObjectDbHelper mDbHelper;


@Overridevoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);(db);

}

ObjectDbHelper (Context ctx){(ctx, ObjectViewProvider.DB_OBJECTS, null, 1);.mCtx = ctx;

}ObjectDbHelper open() throws SQLException {= new ObjectDbHelper(mCtx);= mDbHelper.getWritableDatabase();this;

}void close() {.close();

}

//Поиск запросом LIKECursor fetchRecordsByQuery(String query) {db.query(true, TABLE_NAME, new String[] { _ID,}, NAME + " LIKE" + "'%" + query + "%'", null,, null, null, null);}}


Министерство образования и науки Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ