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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 05.12.2013
Размер файла 4,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

· Freetype - библиотека шрифтов, предназначенная для работы с растровыми и векторными шрифтами.

· Webkit - библиотека, предназначенная для функционирования встроенного в android web-браузера. Webkit поддерживает css, javascript, dom, ajax.

· SGL - движок для работы с 2d-графикой. Android также поддерживает собственную графическую 2d-библиотеку skia, которая написана на языке c и с++ (skia также формирует ядро популярного браузера google chrome).

· SSL - библиотека предназначена для работы с сокетами, основанная на протоколе ssl: sslv3.0 или tslv1.2.

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

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

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

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

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

Core 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.

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

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

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

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

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

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

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

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

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

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

Рис. 4 пример дерева представлений для деятельностей

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

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

Рис. 5 Главное окно программы

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

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

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

Рис.7 Элементы разметки

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

При нажатии на кнопку <poi> открывается активити содержащее список групп туристических объектов города Екатеринбурга.

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

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

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

Рис.8 Окно map

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

Рис.9 Иерархия разметки окна map

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

При выборе пункта poi открывается активити, содержащее список групп туристических объектов города Екатеринбурга.

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

При нажатии на маркер объекта появляется всплывающее окно с краткой информацией об объекте.

Рис. 10 Выбор и отображение групп объектов на карте.

При выборе пункта search появляется всплывающее меню с двумя кнопками (search by address, search by coordinates) (рисунок 11).

Рис. 11 Всплывающее меню search

При нажатии на кнопку <Search by address> открывается форма, содержащая два поля (street и house) и две кнопки (Ok и Cancel) . При нажатии на кнопку Ok на карте отображается маркер, соответствующий введенному адресу (рисунок 12).

Рис. 12 Поиск по адресу

При нажатии на кнопку <Search by coordinates> открывается форма, содержащая два поля (Latitude и Longitude) и две кнопки (Ok и Cancel) . При нажатии на кнопку Ok на карте отображается маркер, соответствующий введенным координатам (рисунок 13).

Рис. 13 Поиск по координатам

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

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

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

Рис. 14 Окно poi

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

Рис. 15 Иерархия разметки окна poi

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

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

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

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

Рис. 16 Окно TheatersViewActivity

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

Рис. 17 Иерархия разметки окна TheatersViewActivity.

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

При нажатии на какой-либо элемент списка открывается всплывающее окно с двумя кнопками (add on map, information) (рисунок 18).

Рис. 18 Всплывающее окно TheatersViewActivity

При нажатии на кнопку < add on map > объект отображается на карте (рисунок 19).

Рис. 19 Отображение объекта на карте

При нажатии на кнопку <information> открывается всплывающее окно с краткой информацией (название, адрес, время работы, описание объекта)

Деятельности MuseamViewActivity, ArhitectureViewActivity, InterestViewActivity, TemplesViewActivity, HostelViewActivity устроены аналогичным образом (рисунок 20)

Рис. 20 Деятельности MuseamViewActivity, ArhitectureViewActivity, InterestViewActivity, TemplesViewActivity, HostelViewActivity

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

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

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

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

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.touristmap" android:versioncode="1" android:versionname="1.0.">

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

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

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"

android:label="map" />

<activity android:name=".activities.objectseditoractivity"

android:label="objects">

</activity>

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

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

<provider android:name=".providers.objectviewprovider"

Android: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="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

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

<button

android:id="@+id/button_map"

android:text="map"

android:layout_width="wrap_content"

android:layout_height="wrap_content/>

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

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

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

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

Public void onCreate(Bundle savedinstancestate) {

super.onCreate(savedinstancestate);

SetContentView(R.layout.main);

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

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

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

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

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

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

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

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

final Button button_map = (Button) findViewById (R.id.button_map);

button_map.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent mapsActivity = new Intent(MainActivity.this,MapsActivity.class);

startActivity(mapsActivity);

}

});

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

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

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

super.onCreate(savedInstanceState);

setContentView(R.layout.map);

myMapView = (MapView) findViewById(R.id.mapView);

mapController = myMapView.getController();

myMapView.setStreetView(true);

myMapView.setBuiltInZoomControls(true);

mapOverlays = myMapView.getOverlays();

mapController.setCenter(START_POINT);

mapController.setZoom(12);

MapOverlay mapOverlay = new MapOverlay();

List<Overlay> listOfOverlays = myMapView.getOverlays();

listOfOverlays.clear();

listOfOverlays.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:

· Создается список групп объектов

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

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

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

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

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

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

файлы MuseamViewActivity.java, ArhitectureViewActivity.java, InterestViewActivity.java, TemplesViewActivity.java, HostelViewActivity.java аналогичным образом определяют структуру соответствующих окон.

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

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

public void onCreate(SQLiteDatabase db){

db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+ NAME + " TEXT, " + ADDRESS + " TEXT, " + LAT + " TEXT, " + LON + " TEXT);");

ContentValues values = new ContentValues();

values.put(NAME, "Театр Эстрады");

values.put(ADDRESS, "8 Марта 15");

values.put(LAT, "56.835662");

values.put(LON, "60.600392");

db.insert(TABLE_NAME, NAME, values);

Файлы MuseamDbHelper.java, ArhitectureDbHelper.java, InterestDbHelper.java, TemplesDbHelper.java, HostelDbHelper.java устроены аналогичным образом.

Провайдеры

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

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

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

private SQLiteDatabase db;

@Override

public boolean onCreate() {

db = (new ObjectDbHelper(getContext())).getWritableDatabase();

return (db == null) ? false : true;

}

Метод query(Uri url, String[] projection,

String selection, String[] selectionArgs, String sort)реализует запрос к бд.

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

Метод update(Uri url, ContentValues values,

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

Файлы MuseamProvider.java, InterestProvider.java, ArhitectureProvider.java, TemplesProvider.java, HostelProvider.java устроены аналогичным образом.

ЗАКЛЮЧЕНИЕ

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

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

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

· Добавление возможности редактирования и сохранения информации о туристических объектах в базе данных.

· Расширение базы данных туристических объектов.

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

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

ЛИТЕРАТУРА

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

2. http://www.dataplus.ru/ - ООО "ДАТА+" - распространение в России и других странах СНГ передовых геоинформационных технологий ESRI.

3. http://www.trisoftrus.com/ - Научно-техническая фирма Трисофт

4. http://www.objectland.ru/ - Геоинформационная система ObjectLand

5. Голощапов А.Л. - Google Android. Программирование для мобильных устройств

6. Reto Meier - Professional Android™ 2 Application development

7. Rick Rogers, John Lombardo, Zigurd Mednieks, and Blake Meike - Android Application Development

8. Chris Haseman - Android Essentials

ПРИЛОЖЕНИЕ

Файл AndroidManifest.xml

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.touristmap" android:versionCode="1" android:versionName="1.0.">

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

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

<provider android:name=".providers.ObjectViewProvider"

android:authorities="com.touristmap.ObjectViewProvider">

</provider>

<provider android:name=".providers.MuseamProvider"

android:authorities="com.touristmap.MuseamProvider">

</provider>

<provider android:name=".providers.ArhitectureProvider"

android:authorities="com.touristmap.ArhitectureProvider">

</provider>

<provider android:name=".providers.InterestProvider"

android:authorities="com.touristmap.InterestProvider">

</provider>

<provider android:name=".providers.TemplesProvider"

android:authorities="com.touristmap.TemplesProvider">

</provider>

<provider android:name=".providers.HostelProvider"

android:authorities="com.touristmap.HostelProvider">

</provider>

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

<activity android:name=".activities.MainActivity"

android:label="TouristMap MainMenu"

android: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"

android:label="Map" />

<activity android:name=".activities.ObjectsEditorActivity"

android:label="Objects">

</activity>

<activity android:name=".activities.TheatersViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.MuseamViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.ArhitectureViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.InterestViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.TemplesViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.HostelViewActivity"

android:label="@string/title_view">

</activity>

<activity android:name=".activities.ViewObjectOnMapActivity"

android: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.java

package com.touristmap.activities;

import com.touristmap.R;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.location.LocationManager;

import android.os.Bundle;

import android.provider.Settings;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

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

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

final AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setMessage("GPS выключен")

.setCancelable(false)

.setPositiveButton("Настройки GPS", new DialogInterface.OnClickListener() {

public void onClick(final DialogInterface dialog, final int id) {

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

startActivityForResult(intent, 1);

}

})

.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {

public void onClick(final DialogInterface dialog, final int id) {

finish();

}

});

final AlertDialog alert = builder.create();

alert.show();

}

final Button button_map = (Button) findViewById (R.id.button_map);

button_map.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent mapsActivity = new Intent(MainActivity.this,MapsActivity.class);

startActivity(mapsActivity);

}

});

final Button button_settings = (Button) findViewById (R.id.button_poi);

button_settings.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent objectsEditorActivity = new Intent(MainActivity.this,ObjectsEditorActivity.class);

startActivity(objectsEditorActivity);

}

});

final Button button_exit = (Button) findViewById (R.id.button_exit);

button_exit.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

}

}

Файл map.xml

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

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<com.google.android.maps.MapView

android:id="@+id/mapView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:enabled="true"

android:clickable="true"

android:apiKey="0GJi6BBZP0bHZdweHL03Lq1vTlpaVxMqpoZrqMQ"

/>

</LinearLayout>

Файл MapsActivity.java

package com.touristmap.activities;

import android.net.Uri;

import android.os.Bundle;

import com.touristmap.DirectionPathOverlay;

import com.touristmap.HelloItemizedOverlay;

import com.touristmap.MyPositionOverlay;

import com.touristmap.ObjectDbHelper;

import com.touristmap.R;

import com.google.android.maps.GeoPoint;

import com.google.android.maps.MapActivity;

import com.google.android.maps.MapController;

import com.google.android.maps.MapView;

import com.google.android.maps.Overlay;

import com.google.android.maps.OverlayItem;

import com.touristmap.activities.MapsActivity;

import com.touristmap.providers.ArhitectureProvider;

import com.touristmap.providers.HostelProvider;

import com.touristmap.providers.InterestProvider;

import com.touristmap.providers.MuseamProvider;

import com.touristmap.providers.ObjectViewProvider;

import com.touristmap.providers.TemplesProvider;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.drawable.Drawable;

import android.location.Address;

import android.location.Criteria;

import android.location.Geocoder;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuItem;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.*;

public class MapsActivity extends MapActivity {

MapController mapController;

MyPositionOverlay positionOverlay;

private String[] street;

private int[] house;

private double[] lath;

private double[] lonh;

private int sizeSTR=-1;

private String streetIsc="ленина";

private int houseIsc = 47;

private double latIsc=0;

private double lonIsc=0;

public static final int IDM_SETTINGS = 101;

public static final int IDM_ADD_OBJ = 102;

public static final int IDM_ADD_ROUTE = 103;

public static final int IDM_PATH_TEST = 104;

public static final int IDM_SEARCH = 105;

public static final int IDM_EXIT = 106;

private final static int IDD_OBJECTS = 0;

private final static int IDD_ADD_TOURIST_ROUTE = 1;

private final static int IDD_COLLECT_ROUTE=2;

final CharSequence[] mObjects = { "Theaters", "Museams", "Monuments", "Interest Objects", "Temples", "Hostels" };

final boolean[] mCheckedObjItems = { false, false, false, false, false,false };

final boolean[] mCheckedPathItems = { false, false, false, false, false, false };

final CharSequence[] mRouteObj = { "Памятник первому паравозу", "гостиница Свердловск", "Усадьба Расторгуева-Харитонова", "Храм-на-крови", "Отель Вознесенский", "Галерея Эгида", "Коляда-театр", "Площадь Советской Армии", "Театр Музыкальной Комедии", "Гостиница Исеть", "Памятник “Первая конная”" };

final boolean[] mCheckedRouteObjItems = { false, false, false, false, false, false, false, false, false, false, false};

private static final String[] mCoord = new String[] { ObjectDbHelper._ID,

ObjectDbHelper.NAME, ObjectDbHelper.LAT, ObjectDbHelper.LON };

public static String NLAT = "nlat";

public static String NLNG = "nlng";

List<Overlay> mapOverlays;

HelloItemizedOverlay itemizedOverlay;

MapView myMapView;

double lat;

double lng;

private double[] latiC;

private double[] longC;

private String[] nameC;

Drawable theatres;

Drawable museams;

Drawable monuments;

Drawable interestObjects;

Drawable temples;

Drawable hostels;

String path = "/mnt/sdcard/OutCoord.txt";

String coord = "/mnt/sdcard/coord.txt";

String in = "/mnt/sdcard/in.txt";

String out = "/mnt/sdcard/out.txt";

String out_coord = "/mnt/sdcard/OutCoord.txt";

private int[][] A;

private int s, t;

private int size = -1;

int[] d;

private Stack<Integer> st;

private Stack<Integer> st1;

private int stackSize = 0;

public LinkedList<Integer> l = new LinkedList<Integer>();

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

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.map);

myMapView = (MapView) findViewById(R.id.mapView);

mapController = myMapView.getController();

myMapView.setStreetView(true);

myMapView.setBuiltInZoomControls(true);

mapOverlays = myMapView.getOverlays();

mapController.setCenter(START_POINT);

mapController.setZoom(12);

// Добавляем маркер своего местоположения

positionOverlay = new MyPositionOverlay();

List<Overlay> overlays = myMapView.getOverlays();

overlays.add(positionOverlay);

theatres = getResources().getDrawable(R.drawable.h_theatre);

museams = getResources().getDrawable(R.drawable.h_museum);

monuments = getResources().getDrawable(R.drawable.h_memorial);

interestObjects = getResources().getDrawable(R.drawable.h_view_point);

temples = getResources().getDrawable(R.drawable.h_shelter);

hostels = getResources().getDrawable(R.drawable.h_hotel);

LocationManager locationManager;

String context = Context.LOCATION_SERVICE;

locationManager = (LocationManager) getSystemService(context);

Criteria criteria = new Criteria();

criteria.setAccuracy(Criteria.ACCURACY_FINE);

criteria.setAltitudeRequired(false);

criteria.setBearingRequired(false);

criteria.setCostAllowed(true);

criteria.setPowerRequirement(Criteria.POWER_LOW);

String provider = locationManager.getBestProvider(criteria, true);

Location location = locationManager.getLastKnownLocation(provider);

updateWithNewLocation(location);

locationManager.requestLocationUpdates(provider, 1500, 3,

locationListener);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

menu.add(Menu.NONE, IDM_SETTINGS, Menu.NONE, "POI")

.setAlphabeticShortcut('p');

menu.add(Menu.NONE, IDM_ADD_OBJ, Menu.NONE, "Add objects")

.setAlphabeticShortcut('a');

menu.add(Menu.NONE, IDM_ADD_ROUTE, Menu.NONE, "Route")

.setAlphabeticShortcut('r');

menu.add(Menu.NONE, IDM_SEARCH, Menu.NONE, "Search")

.setAlphabeticShortcut('s');

menu.add(Menu.NONE, IDM_EXIT, Menu.NONE, "Exit").setAlphabeticShortcut(

'x');

return (super.onCreateOptionsMenu(menu));

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case IDM_SETTINGS:

Intent objectsEditorActivity = new Intent(MapsActivity.this, ObjectsEditorActivity.class);

startActivity(objectsEditorActivity);

item.setChecked(true);

break;

case IDM_ADD_OBJ:

showDialog(IDD_OBJECTS);

item.setChecked(true);

break;

case IDM_SEARCH:

LayoutInflater inflater = LayoutInflater.from(this);

View root = inflater.inflate(R.layout.search_menu2, null);

final Button button_addr = (Button) root.findViewById(R.id.button_addr);

final Button button_coord = (Button) root.findViewById(R.id.button_coord);

button_addr.setText("Search by address");

button_coord.setText("Search by coordinates");

AlertDialog.Builder menu = new AlertDialog.Builder(this);

menu.setView(root);

menu.show();

button_addr.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

CallSearchAddressDialog();

};

});

button_coord.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

CallSearchCoordDialog();

};

});

item.setChecked(true);

break;

case IDM_EXIT:

System.exit(0);

break;

default:

return false;

}

return true;

}

// Меню с чекбоксами для добавления групп объектов на карту

@Override

protected Dialog onCreateDialog(int id) {

switch (id) {

case IDD_OBJECTS:

AlertDialog.Builder builderObj = new AlertDialog.Builder(this);

builderObj.setTitle("Add group objects");

builderObj.setMultiChoiceItems(mObjects, mCheckedObjItems, new DialogInterface.OnMultiChoiceClickListener() {

@Override

public void onClick(DialogInterface dialog, int which, boolean isChecked) {

mCheckedObjItems[which] = isChecked;

}

});

builderObj.setPositiveButton("OK", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int id) {

if (!mapOverlays.isEmpty()) {

mapOverlays.clear();

} else {

if (mCheckedObjItems[0]) {

addGroup(ObjectViewProvider.CONTENT_URI, theatres);

}

if (mCheckedObjItems[1]) {

addGroup(MuseamProvider.CONTENT_URI, museams);

}

if (mCheckedObjItems[2]) {

addGroup(ArhitectureProvider.CONTENT_URI, monuments);

}

if (mCheckedObjItems[3]) {

addGroup(InterestProvider.CONTENT_URI, interestObjects);

}

if (mCheckedObjItems[4]) {

addGroup(TemplesProvider.CONTENT_URI, temples);

}

if (mCheckedObjItems[5]) {

addGroup(HostelProvider.CONTENT_URI, hostels);

}

}

}

});

builderObj.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int id) {

dialog.cancel();

Toast.makeText(getApplicationContext(), "Dialog cancel", Toast.LENGTH_SHORT).show();

}

});

builderObj.setCancelable(false);

return builderObj.create();

// Процедура Добавления группы объектов на карту

private void addGroup(Uri uri, Drawable drawable) {

Cursor cursor = managedQuery(uri, mCoord, "_ID", null, null);

int count = cursor.getCount();

latiC = new double[count];

longC = new double[count];

nameC = new String[count];

for (int i = 0; i < count; i++) {

latiC[i] = -1;

longC[i] = -1;

nameC[i] = "";

}

for (int i = 0; i < count; i++) {

cursor.moveToPosition(i);

lat = Double.parseDouble(cursor.getString(2));

lng = Double.parseDouble(cursor.getString(3));

latiC[i] = lat;

longC[i] = lng;

nameC[i] = cursor.getString(1);

}

double nl, nlg;

itemizedOverlay = new HelloItemizedOverlay(this, drawable);

try {

for (int i = 0; i < count; i++) {

nl = latiC[i];

nlg = longC[i];

String name = nameC[i];

isAddLocationPoint(nl, nlg, name);

}

} catch (NullPointerException e) {

e.printStackTrace();

}

}

// Процедура добавления точки на карту

public void isAddLocationPoint(double netlat, double netlng, String name) {

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

(int) (netlng * 1E6));

String coord = "Широта: " + netlat + "\nДолгота: " + netlng;

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

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

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

mapController.animateTo(point);

mapController.setZoom(13);

// Добавляем точку на карту

itemizedOverlay.addOverlay(overlayitem);

mapOverlays.add(itemizedOverlay);

}

//Процедура поиска по адресу

private void CallSearchAddressDialog() {

LayoutInflater inflater = LayoutInflater.from(this);

View root = inflater.inflate(R.layout.search_address, null);

final EditText textStreet = (EditText)root.findViewById(R.id.street);

final EditText textHouse = (EditText)root.findViewById(R.id.house);

AlertDialog.Builder b = new AlertDialog.Builder(this);

b.setView(root);

b.setTitle("Search by address");

b.setPositiveButton(

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

public void onClick(DialogInterface dialog, int whichButton) {

String street = textStreet.getText().toString();

int house = Integer.parseInt(textHouse.getText().toString());

ReadInTxtSearch();

searchadress(street, house);

if (latIsc!=0 & lonIsc !=0 ){

String text = "Широта: " + latIsc + "\nДолгота: "

+ lonIsc;

Toast.makeText(getBaseContext(), text, Toast.LENGTH_SHORT).show();

itemizedOverlay = new HelloItemizedOverlay(null, getResources().getDrawable(R.drawable.androidmarker));

isAddLocationPoint(latIsc, lonIsc, "Искомая точка");

}

else {

String ErrMsg = "Адрес не найден!";

Toast.makeText(getBaseContext(), ErrMsg, Toast.LENGTH_SHORT).show();

}

}

});

b.setNegativeButton(

"Cancel", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {}

});

b.show();

}

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

private void CallSearchCoordDialog() {

LayoutInflater inflater = LayoutInflater.from(this);

View root = inflater.inflate(R.layout.search_coord, null);

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

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

AlertDialog.Builder b = new AlertDialog.Builder(this);

b.setView(root);

b.setTitle("Search by coordinates");

b.setPositiveButton(

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

public void onClick(DialogInterface dialog, int whichButton) {

String sslat = textLatitude.getText().toString();

String sslon = textLongitude.getText().toString();

double slat = Double.parseDouble(sslat);

double slon = Double.parseDouble(sslon);

Drawable SearchCoord = getResources().getDrawable(R.drawable.androidmarker);

itemizedOverlay = new HelloItemizedOverlay( null, SearchCoord);

isAddLocationPoint (slat,slon,"искомая точка");

}

});

b.setNegativeButton(

"Cancel", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {}

});

b.show();

}

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

private void ReadInTxtSearch()

{

try

{

BufferedReader ibr = new BufferedReader(

new InputStreamReader(

new FileInputStream("/mnt/sdcard/insearch.txt"),"windows-1251"));

String str;

Scanner scanner;

String[] vr;

sizeSTR=Integer.parseInt(ibr.readLine());

street = new String [sizeSTR];

house = new int [sizeSTR];

lath = new double [sizeSTR];

lonh = new double [sizeSTR];

vr = new String [4];

int a;

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

{

lath[i]=-1000;

lonh[i]=-1000;

street[i]=" ";

house[i]=-1;

}

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

{

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

{

vr[j]="";

}

a=0;

str=ibr.readLine();

scanner = new Scanner(str);

while (scanner.hasNext())

{

vr[a]=scanner.next();

a=a+1;

}

street[i]=vr[0];

house[i]=Integer.parseInt(vr[1]);

lath[i]=Double.parseDouble(vr[2]);

lonh[i]=Double.parseDouble(vr[3]);

}

ibr.close();

}

catch(IOException ae){}

};

private void searchadress(String streetIsc, int houseIsc)

{

streetIsc = streetIsc.toLowerCase();

int fl=0, ch=0;

while ((fl==0) & (ch<sizeSTR))

{

if ((streetIsc.equals(street[ch])) & (houseIsc == house[ch]))

{

latIsc = lath[ch];

lonIsc = lonh[ch];

fl=1;

}

ch=ch+1;

}

}}

Файл ObjectsEditorActivity.java

package com.touristmap.activities;

import com.touristmap.R;

import android.os.Bundle;

import android.app.ListActivity;

import android.content.Intent;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class ObjectsEditorActivity extends ListActivity {

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

private int mId = -1;

String[] mObjectsClass = { "Theaters", "Museams", "Monuments",

"Interest Objects", "Temples", "Hostels" };

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.objects);

setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, mObjectsClass));

}

public void onListItemClick(ListView parent, View v, int position, long id) {

mId = position;

switch (mId) {

case 0: {

Intent intent = new Intent();

intent.setClass(this, TheatersViewActivity.class);

startActivity(intent);

}

break;

case 1: {

Intent intent = new Intent();

intent.setClass(this, MuseamViewActivity.class);

startActivity(intent);

}

break;

case 2: {

Intent intent = new Intent();

intent.setClass(this, ArhitectureViewActivity.class);

startActivity(intent);

}

break;

case 3: {

Intent intent = new Intent();

intent.setClass(this, InterestViewActivity.class);

startActivity(intent);

}

break;

case 4: {

Intent intent = new Intent();

intent.setClass(this, TemplesViewActivity.class);

startActivity(intent);

}

break;

case 5: {

Intent intent = new Intent();

intent.setClass(this, HostelViewActivity.class);

startActivity(intent);

}

break;

}

}

}

Файл TheatersViewActivity.java

package com.touristmap.activities;

import com.touristmap.ObjectDbHelper;

import com.touristmap.R;

import com.touristmap.providers.ObjectViewProvider;

import android.os.Bundle;

import android.app.AlertDialog;

import android.app.ListActivity;

import android.database.Cursor;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.ListAdapter;

import android.widget.SimpleCursorAdapter;

import android.widget.Toast;

import android.content.Intent;

public class TheatersViewActivity extends ListActivity {

private Cursor mCursor;

private ListAdapter mAdapter;

private String netlat;

private String netlng;

double lat;

double lng;

private static final String[] mContent = new String[] { ObjectDbHelper._ID,

ObjectDbHelper.NAME, ObjectDbHelper.ADDRESS };

private static final String[] displayContent = new String[] {

ObjectDbHelper.NAME, ObjectDbHelper.ADDRESS };

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

private int infId;

private static final String[] mCoord = new String[] { ObjectDbHelper._ID,

ObjectDbHelper.LAT, ObjectDbHelper.LON };

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mCursor = managedQuery(ObjectViewProvider.CONTENT_URI, mContent, null,

null, null);

mAdapter = new SimpleCursorAdapter(this, R.layout.object_view, mCursor,

displayContent, displayViews);

setListAdapter(mAdapter);

}

public void onListItemClick(ListView parent, View v, int position, long id) {

infId = position;

Cursor cursor = managedQuery(ObjectViewProvider.CONTENT_URI, mCoord,

"_ID", null, null);

cursor.moveToPosition(position);

String text = "Широта: " + cursor.getString(1) + "\nДолгота: "

+ cursor.getString(2);

Toast.makeText(this, text, Toast.LENGTH_SHORT).show();

netlat = cursor.getString(1);

netlng = cursor.getString(2);

LayoutInflater inflater = LayoutInflater.from(this);

View root = inflater.inflate(R.layout.object_menu, null);

final Button button_add = (Button) root.findViewById(R.id.button_add);

final Button button_info = (Button) root.findViewById(R.id.button_info);

final Button button_route = (Button) root.findViewById(R.id.button_route);

button_add.setText("Add on Map");

button_info.setText("Information");

button_route.setText("Construct a route");

AlertDialog.Builder menu = new AlertDialog.Builder(this);

menu.setView(root);

menu.show();

button_info.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

CallObjectInfoDialog();

};

});

button_add.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

CallViewOnMap();

};

});

button_route.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

};

});

}

private void CallViewOnMap(){

Intent intent = new Intent();

intent.setClass(this, ViewObjectOnMapActivity.class);

intent.putExtra(MapsActivity.NLAT, netlat);

intent.putExtra(MapsActivity.NLNG, netlng);

startActivity(intent);

finish();

}

private void CallObjectInfoDialog() {

LayoutInflater inflater = LayoutInflater.from(this);

View root = inflater.inflate(R.layout.object_info, null);

final TextView textName = (TextView) root.findViewById(R.id.name);

final TextView textPhone = (TextView) root.findViewById(R.id.address);

mCursor.moveToPosition(infId);

textName.setText(mCursor.getString(1));

textPhone.setText(mCursor.getString(2));

AlertDialog.Builder b = new AlertDialog.Builder(this);

b.setView(root);

b.show();

}

}

Файл ObjectViewProvider.java

package com.touristmap.providers;

import java.util.HashMap;

import com.touristmap.ObjectDbHelper;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

import android.text.TextUtils;

public class ObjectViewProvider extends ContentProvider {

public static final String DB_OBJECTS = "objects.db";

public static final Uri CONTENT_URI = Uri.parse("content://com.touristmap.ObjectViewProvider/object");

public static final int URI_CODE = 1;

public static final int URI_CODE_ID = 2;

private static final UriMatcher mUriMatcher;

private static HashMap<String, String> mObjectMap;

private SQLiteDatabase db;

static {

mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

mUriMatcher.addURI("com.touristmap.ObjectViewProvider",

ObjectDbHelper.TABLE_NAME, URI_CODE);

mUriMatcher.addURI("com.touristmap.ObjectViewProvider",

ObjectDbHelper.TABLE_NAME + "/#", URI_CODE_ID);

mObjectMap = new HashMap<String, String>();

mObjectMap.put(ObjectDbHelper._ID, ObjectDbHelper._ID);

mObjectMap.put(ObjectDbHelper.NAME, ObjectDbHelper.NAME);

mObjectMap.put(ObjectDbHelper.ADDRESS, ObjectDbHelper.ADDRESS);

mObjectMap.put(ObjectDbHelper.LAT, ObjectDbHelper.LAT);

mObjectMap.put(ObjectDbHelper.LON, ObjectDbHelper.LON);

}

public String getDbName() {

return(DB_OBJECTS);

}

@Override

public boolean onCreate() {

db = (new ObjectDbHelper(getContext())).getWritableDatabase();

return (db == null) ? false : true;

}

@Override

public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sort) {

String orderBy;

if (TextUtils.isEmpty(sort)) {

orderBy = ObjectDbHelper.NAME;

}

else {

orderBy = sort;

}

Cursor c = db.query(ObjectDbHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, orderBy);


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.