Статья для занятий по информатике «Сэйвер изображений и видео на базе Android development tools»

1
0
Материал опубликован 7 May 2020

85

СОДЕРЖАНИЕ


Y

ВВЕДЕНИЕ 4

ГЛАВА I. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ РАБОТЫ С ГРАФИЧЕСКИМИ ДАННЫМИ 7

1.1. Определения и понятия 7

1.2. Форматы графических файлов 13

1.3. Обзор программного обеспечения для работы с графическими файлами 16

Выводы к Главе 1 19

ГЛАВА II. ANDROID SDK – КОМПЛЕКТ СРЕДСТВ РАЗРАБОТКИ ПРИЛОЖЕНИЙ 20

2.1. Выбор среды и языка программирования 20

2.2. Базовые сведения о платформе Android 21

2.3. Установка Android SDK 38

2.4. Инструменты для разработки и отладки приложений 41

2.5. Установка Eclipse 44

Выводы к Главе 2 47

ГЛАВА III. РАЗРАБОТКА И РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ СЭЙВЕРОМ ИЗОБРАЖЕНИЙ И ВИДЕО «TOTAL» 48

3.1. UML диаграммы 48

3.2. Средства разработки сэйвера «Total» 55

3.3. Руководство пользователя приложением «Total» 63

Выводы к Главе 3 68

ЗАКЛЮЧЕНИЕ 69

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 71

Приложение А. Класс FileManager.java 74

Приложение Б. Класс DirectoryInfo.java 83

ВВЕДЕНИЕ

Актуальность темы. За последние несколько лет технический прогресс развился настолько, что те функции, которыми обладали настольные ПК, стали доступны на экранах карманных устройств. Бывает, мобильный терминал оснащен таким количеством функций и возможностей, что его владельцу позавидуют даже владельцы некоторых ноутбуков. В будущем смартфоны будут как средством связи, так и устройствами обработки информации. Мобильные устройства завоевывают все большую популярность, так как развитие мобильных устройств не стоит на месте. А доминирующей на рынке мобильной платформой является операционная система Android. Её доля ≈ 60%. Согласно последнему отчету исследовательской компании Gartner, через несколько лет платформа Android может стать самой популярной операционной системой в мире, что является хорошим поводом для изучения, как самой системы, так и сред разработки под неё [1].

Целью дипломной работы является разработка Сэйвера изображений и видео «Total».

В соответствии с поставленной целью были сформулированы следующие задачи:

Провести обзор литературы по объектно-ориентированному языку программирования Java, мобильной платформе Android, среде программирования IntelliJ IDEA, Eclipse и NetBeans;

Ознакомиться с технической характеристикой, архитектурой, функциональностью, а также принципами работы ОС Android;

Установить и настроить интегрированную среду разработки Eclipce, которая позволяет создавать Java–приложения для мобильных устройств, работающих под управлением Android;

Установить и настроить эмулятор Android Virtual Device, который используется для проектирования, отладки и тестирования приложений в реальной среде выполнения;

Разработать Java - приложение для платформы Android.

Объектом исследования дипломной работы является процесс разработки сэйвера изображений и видео на базе Android Development Tools.

Предметом дипломной работы является разработка сэйвера изображений и видео «Total».

Научная новизна заключается в исследование аспектов разработки сэйвера изображений и видео на базе Android Development Tools.

Практическая значимость. Созданное приложение «Total» имеет универсальный характер и может лежать в основе разработки других приложений.

Методы исследования. Для создания приложения были рассмотрены и проанализированы существующие интегрированные среды разработки IDE (Integrated development environment) такие как IntelliJ IDEA ,Eclipse, Visual Studio, NetBeans. На основе проведенного анализа был сделан вывод, что для создания Java приложения целесообразней использовать среду разработки Eclipce.

Структура и объем работы. Структура работы представляет собой отображение последовательности действий в ходе выполнения данной дипломной работы и решения поставленных задач. Полный объем работы составляет 84 страниц. Основное содержание изложено на 74 страницах. Работа включает 29 рисунков и одну таблицу. Список использованной литературы содержит 33 источников.

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

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

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

Во второй главе проведен обзор программного обеспечения, требуемого для разработки приложений под Android: Java Development Kit, IntelliJ IDEA, Android SDK, Android Development Tools

В третьей главе дается краткое описание разработанного Java приложения на примере сэйвера «Total».


ГЛАВА I. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ РАБОТЫ С ГРАФИЧЕСКИМИ ДАННЫМИ 1.1. Определения и понятия

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

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

Графические данные – изображение в виде рисунков, которые несут графическую информацию.

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

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

В зависимости от способа формирования изображений компьютерную графику принято подразделять на растровую, векторную и фрактальную [33].

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

Особенности цветового охвата характеризуют такие понятия, как черно-белая и цветная графика. На специализацию в отдельных областях указывают названия некоторых разделов: инженерная графика, научная графика, Web-графика, компьютерная полиграфия и прочие.

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

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

Хотя компьютерная графика служит всего лишь инструментом, ее структура и методы основаны на передовых достижениях фундаментальных и прикладных наук: математики, физики, химии, биологии, статистики, программирования и множества других. Это замечание справедливо как для программных, так и для аппаратных средств создания и обработки изображений на компьютере. Поэтому компьютерная графика является одной из наиболее бурно развивающихся отраслей информатики и во многих случаях выступает «локомотивом», тянущим за собой всю компьютерную индустрию [23].



Фрактальная графика

Фрактальная графика основана на математических вычислениях. Базовым элементом фрактальной графики является сама математическая формула, то есть никаких объектов в памяти компьютера не хранится и изображение строится исключительно по уравнениям [23]. Таким способом строят как простейшие регулярные структуры, так и сложные иллюстрации, имитирующие природные ландшафты и трехмерные объекты (рис.1.1).

t1588847988aa.png

Рисунок 1.1. Фрактальная графика

Растровая графика

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

разрешение оригинала;

разрешение экранного изображения;

разрешение печатного изображения.

Разрешение оригинала. Разрешение оригинала измеряется в точках на дюйм (dots per inch – dpi) и зависит от требований к качеству изображения и размеру файла, способу оцифровки и создания исходной иллюстрации, избранному формату файла и другим параметрам. В общем случае действует правило: чем выше требование к качеству, тем выше должно быть разрешение оригинала [33].

Разрешение экранного изображения. Для экранных копий изображения элементарную точку растра принято называть пикселом. Размер пиксела варьируется в зависимости от выбранного экранного разрешения (из диапазона стандартных значений), разрешение оригинала и масштаб Разрешение печатного изображения и понятие линиатуры. Размер точки растрового изображения как на твердой копии (бумага, пленка и т. д.), так и на экране зависит от примененного метода и параметров растрирования оригинала. При растрировании на оригинал как бы накладывается сетка линий, ячейки которой образуют элемент растра. Частота сетки растра измеряется числом линий на дюйм (lines per inch – Ipi) и называется линиатурой [22].

Размер точки растра рассчитывается для каждого элемента и зависит от интенсивности тона в данной ячейке. Чем больше интенсивность, тем плотнее заполняется элемент растра. То есть, если в ячейку попал абсолютно черный цвет, размер точки растра совпадет с размером элемента растра. В этом случае говорят о 100% заполняемости. Для абсолютно белого цвета значение заполняемости составит 0%. На практике заполняемость элемента на отпечатке обычно составляет от 3 до 98%. При этом все точки растра имеют одинаковую оптическую плотность, в идеале приближающуюся к абсолютно черному цвету. Иллюзия более темного тона создается за счет увеличения размеров точек и, как следствие, сокращения пробельного поля между ними при одинаковом расстоянии между центрами элементов растра. Такой метод называют растрированием с амплитудной модуляцией (AM).

Интенсивность тона (так называемую светлоту) принято подразделять на 256 уровней. Большее число градаций не воспринимается зрением человека и является избыточным. Меньшее число ухудшает восприятие изображения (минимально допустимым для качественной полутоновой иллюстрации принято значение 150 уровней) [22]. Нетрудно подсчитать, что для воспроизведения 256 уровней тона достаточно иметь размер ячейки растра 256 = 16 х 16 точек отображения (рис. 1.2).

t1588847988ab.jpg

Рисунок 1.2. Растровое изображение

Векторная графика

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

Линия - элементарный объект векторной графики. Как и любой объект, линия обладает свойствами: формой (прямая, кривая), толщиной, цветом, начертанием (сплошная, пунктирная). Замкнутые линии приобретают свойство заполнения. Охватываемое ими пространство может быть заполнено другими объектами (текстуры, карты) или выбранным цветом [33]. Простейшая незамкнутая линия ограничена двумя точками, именуемыми узлами. Узлы также имеют свойства, параметры которых влияют на форму конца линии и характер сопряжения с другими объектами. Все прочие объекты векторной графики составляются из линий. Например, куб можно составить из шести связанных прямоугольников, каждый из которых, в свою очередь, образован четырьмя связанными линиями (рис.1.3).


t1588847988ac.gif

Рисунок 1.3. Векторное изображение

Трехмерная графика

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

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

Самые совершенные на сегодняшний день устройства созданы для обучения пилотированию космических кораблей и военных летательных аппаратов [23].

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

t1588847988ad.jpg

Рисунок 1.4. Трехмерное изображение

1.2. Форматы графических файлов

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

TIFF (Tagged Image File Format). Формат предназначен для хранения растровых изображений высокого качества (расширение имени файла .TIF).

Относится к числу широко распространенных, отличается переносимостью между платформами (IBM PC и Apple Macintosh), обеспечен поддержкой со стороны большинства графических, верстальных и дизайнерских программ. Предусматривает широкий диапазон цветового охвата – от монохромного черно-белого до 32-разрядной модели цветоделения CMYK. Начиная с версии 6.0 в формате TIFF можно хранить сведения о масках (контурах обтравки) изображений. Для уменьшения размера файла применяется встроенный алгоритм сжатия LZW.

PSD (PhotoShop Document). Собственный формат программы Adobe Photoshop (расширение имени файла .PSD), один из наиболее мощных по возможностям хранения растровой графической информации. Позволяет запоминать параметры слоев, каналов, степени прозрачности, множества масок. Поддерживаются 48-разрядное кодирование цвета, цветоделение и различные цветовые модели. Основной недостаток выражен в том, что отсутствие эффективного алгоритма сжатия информации приводит к большому объему файлов [18].

PCX. Формат появился как формат хранения растровых данных программы PC PaintBrush фирмы Z-Soft и является одним из наиболее распространенных (расширение имени файла .PCX). Отсутствие возможности хранить цветоделенные изображения, недостаточность цветовых моделей и другие ограничения привели к утрате популярности формата. В настоящее время считается устаревшим [18].

JPEG (Joint Photographic Experts Group). Формат предназначен для хранения растровых изображений (расширение имени файла .JPG). Позволяет регулировать соотношение между степенью сжатия файла и качеством изображения. Применяемые методы сжатия основаны на удалении «избыточной» информации, поэтому формат рекомендуют использовать только для электронных публикаций [19].

GIF (Graphics Interchange Format). Стандартизирован в 1987 году как средство хранения сжатых изображений с фиксированным (256) количеством цветов (расширение имени файла .GIF). Получил популярность в Интернете благодаря высокой степени сжатия. Последняя версия формата GIF89a позволяет выполнять чересстрочную загрузку изображений и создавать рисунки с прозрачным фоном. Ограниченные возможности по количеству цветов обусловливают его применение исключительно в электронных публикациях.

PNG (Portable Network Graphics). Сравнительно новый (1995 год) формат хранения изображений для их публикации в Интернете (расширение имени файла .PNG). Поддерживаются три типа изображений – цветные с глубиной 8 или 24 бита и черно-белое с градацией 256 оттенков серого. Сжатие информации происходит практически без потерь, предусмотрены 254 уровня альфа-канала, чересстрочная развертка.

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

EPS (Encapsulated PostScript). Формат описания как векторных, так и растровых изображений на языке PostScript фирмы Adobe, фактическом стандарте в области допечатных процессов и полиграфии (расширение имени файла .EPS). Так как язык PostScript является универсальным, в файле могут одновременно храниться векторная и растровая графика, шрифты, контуры обтравки (маски), параметры калибровки оборудования, цветовые профили. Для отображения на экране векторного содержимого используется формат WMF, а растрового - TIFF. Но экранная копия лишь в общих чертах отображает реальное изображение, что является существенным недостатком EPS. Действительное изображение можно увидеть лишь на выходе выводного устройства, с помощью специальных программ просмотра или после преобразования файла в формат PDF в приложениях Acrobat Reader, Acrobat Exchange.

PDF (Portable Document Format). Формат описания документов, разработанный фирмой Adobe (расширение имени файла .PDF). Хотя этот формат в основном предназначен для хранения документа целиком, его впечатляющие возможности позволяют обеспечить эффективное представление изображений. Формат является аппаратно-независимым, поэтому вывод изображений допустим на любых устройствах - от экрана монитора до фотоэкспонирующего устройства. Мощный алгоритм сжатия со средствами управления итоговым разрешением изображения обеспечивает компактность файлов при высоком качестве иллюстраций [19].

1.3. Обзор программного обеспечения для работы с графическими файлами

Ниже представлен обзор некоторого программного обеспечения для работы с графическими файлами.

Программные средства создания растровых изображений.

Среди программ, предназначенных для создания компьютерной двумерной живописи, самыми популярными считаются Painter компании Fractal Design, FreeHand компании Macromedia, и Fauve Matisse. Пакет Painter обладает достаточно широким спектром средств рисования и работы с цветом. В частности, он моделирует различные инструменты (кисти, карандаш, перо, уголь, аэрограф и др.), позволяет имитировать материалы (акварель, масло, тушь), а также добиться эффекта натуральной среды. В свою» очередь, последние версии программы FreeHand обладают богатыми средствами редактирования изображений и текста, содержат библиотеку спецэффектов и набор инструментов для работы с цветом, в том числе средства многоцветной градиентной заливки.

Среди программ для создания изображений на платформе Macintosh стоит отметить пакет для редактирования растровой живописи и изображений PixelPaint Pro компании Pixel Resources.

Среди программ компьютерной живописи для графических станций Silicon Graphics(SGI) особое место занимает пакет StudioPaint 3D компании Alias Wavefront, который позволяет рисовать различными инструментами («кистями») в режиме реального времени прямо на трехмерных моделях. Пакет работает с неограниченным количеством слоев изображения и предоставляет 30 уровней отмены предыдущего действия (undo), включает операции цветокоррекции и «сплайновые кисти», «мазок» которых можно редактировать по точкам как сплайновую кривую.

StudioPaint 3D поддерживает планшет с чувствительным пером, что дает возможность художнику сделать традиционный эскиз от руки, а затем позволяет перенести рисунок в трехмерные пакеты для моделирования или анимации и построить по эскизу трехмерную модель.

Adobe Photoshop

В обширном классе программ для обработки растровой графики особое место занимает пакет Photoshop компании Adobe. По сути дела, сегодня он является стандартом в компьютерной графике, и все другие программы неизменно сравнивают именно с ним [18].

Главные элементы управления программы Adobe Photoshop сосредоточены в строке меню и панели инструментов.

Программы векторной графики.

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

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

К числу новых возможностей, обнаруженных нами в этой категории изделий, относится многоцветная градиентная закраска. Такие примитивы, как многоугольники, звезды и спирали, стали обычными атрибутами подобных пакетов. Связанные цвета позволяют заменить красный цвет розы желтым, изменив только базовый цвет; все связанные оттенки изменятся автоматически. Многослойные интерактивные цветные «диапозитивы» обеспечивают ранее недостижимую глубину, и вы можете преобразовывать векторные изображения в растровые в рамках векторного графического файла. Если вчерашние пакеты векторной графики позволяли только помещать растровое изображение в ваш файл, то с помощью современных программ можно встраивать представленные в растровой форме изображения, изменять их размеры и даже накладывать специальные эффекты и маски. Это облегчает процесс получения окончательного изображения средствами многослойной графики - объединением векторных и растровых файлов необходимым, для создания логотипов, печатных рекламных объявлений и картинок для Web.

Corel Draw 8-9.

Пакет CorelDraw всегда производит сильное впечатлени. В комплект фирма Corel включила множество программ, в том числе Corel Photo-Paint. Новый пакет располагает бесспорно самым мощным инструментарием среди всех программ обзора, а при этом по сравнению с предыдущей версией интерфейс стал проще, а инструментальные средства рисования и редактирования узлов - более гибкими Художественные возможности оформления текста в CorelDraw безупречны, а принимаемые по умолчанию параметры для межбуквенных интервалов при размещении текста вдоль кривой не требуют настройки, исключающей наложение букв, - в отличие от Canvas и FreeHand. Инструмент «лупа» не имеет себе равных - он позволяет получить множество специальных эффектов, в том числе возможность увеличения только фрагмента изображения и автоматической настройки цветов текста в зависимости от цвета фона. Можно вырезать изображения, накладывать цветные фильтры и придавали растровым изображениям вид изогнутой страницы, используя двух- и трехмерные эффекты и внешние модули PhotoShop. Когда вам нужно было редактировать пикселы, CorelDraw автоматически переключает вас на Corel Photo-Paint, где вы можете редактировать файл и сохранять его непосредственно в CorelDraw [19].

Выводы к Главе 1

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

Также рассмотрены некоторые форматы графических файлов, таких как tiff, psd, jpeg, png, pcx, gif, wmf, pdf. Рассмотрено программное обеспечение для работы с графическими файлами. Создано множество пакетов иллюстративной графики, которые содержат простые в применении, развитые и мощные инструментальные средства векторной графики, предназначенной как для подготовки материалов к печати, так и для создания страниц в интернете, но явными лидерами среди всех прочих являются пакеты Corel Draw и Adobe Photoshop.

ГЛАВА II. ANDROID SDK – КОМПЛЕКТ СРЕДСТВ РАЗРАБОТКИ ПРИЛОЖЕНИЙ 2.1. Выбор среды и языка программирования

Разработчики Android дали возможность создавать дополнения к их Операционной системе, посредством использования Android SDK (Software Development Kit). Как и Android, SDK написан на языке Java, поэтому разработка под Android выполняется исключительно на языке Java. Но существуют программные средства которые позволяют программировать и на других языках, таких как Python, PHP, Lua, Perl и др. Этот проект называется SL4A.

SL4A является инфраструктурой для взаимодействия сценариев языковых движков, которые были перенесены на платформу Android из Android API с помощью удаленного вызова процедур (RPC) к серверу, который реализован в виде стандартного дополнения Android Java.

Как и Android, SL4A является open source и распространяется под Apache License Version 2.0, как и большинство программ Android.

Система SL4A подходит для следующих видов задач [21]:

RAD программирования: С SL4A можно использовать быструю разработку приложений (RAD). Вы можете быстро создать прототип приложения для того чтобы перерыть правильность идеи. Если идея правильная Вы можете создать полноценную программу под Android;

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

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

SL4A позволяет взаимодействовать между сценариями языков - двигателей Android и Android API. Как вы увидите позже, она не ограничена только скриптовыми языками. Любая программа, которая реализует совместимые на основе JSON RPC8 модули или набор процедур может потенциально вызвать Server SL4A RPC.

Внутри, SL4A использует JavaScript Object Notation (JSON) формат данных для обмена сообщениями и данными между SL4A RPC Server и его клиентами. Этот формат является основой для работы, поэтому ниже приведем краткий обзор JSON.

Акроним JSON сначала использовал Дуглас Крокфорд. Формат JSON описан в RFC 4627,9.

Цитата из спецификации о JSON:

«JavaScript Object Notation (JSON) представляет собой легкий, текстовый, независимый от языка формат обмена данными. Она была взята из ECMA Script стандарта языка программирования. JSON определяет малый набор правил форматирования для представления структурированных данных в портативных устройствах. JSON может представлять четыре примитивных типа (строковый, числовой, логический, переменные и ноль) и два структурированные типы (объекты и массивы)».

2.2. Базовые сведения о платформе Android

Версии мобильной платформы Android.

Стремительное развитие операционной системы началось с версии Cupcake 1.5 и Donut 1.6. Версия 2.0 Eclair стала промежуточной, точно такое же имя носила и версия 2.1. Именно под управлением последней были представлены одни из самых популярных устройств - Nexus One и HTC Desire. Затем вышел релиз Android 2.2 Froyo, поддерживающий веб-технологий HTML5 и Flash 10.1, что позволило получить значительное преимущество перед конкурентами. Следом компания представила Android 2.3 Gingerbread с обновленным пользовательским интерфейсом, поддержкой стандарта NFC, нескольких камер и дисплеев высокого разрешения. Но самые глобальные изменения коснулись Android 3.0 Honeycomb, специальной версии для планшетов. В ней используется совершенно иной пользовательский интерфейс, трехмерные эффекты, удобный браузер и множество других улучшений [25].

27 июня 2012 года на Google I/O, компания Google представила следующую версию Android 4.1 Jelly Bean вместе с планшетом Nexus 7. Изменения в основном коснулись плавности работы интерфейса. Новое обновление принесло улучшения в производительности - центральный и графический процессор работают параллельно. Благодаря этому некоторые устройства под управлением Android 4.1 будут работать с частотой не менее 60 кадров в секунду [35].

Технические характеристики платформы Android.

Android - операционная система для мобильных телефонов, планшетных компьютеров, основанная на ядре Linux. Система разрабатывалась компанией Android Inc, которую купила Google. После покупки Google создал отдел Open Handset Alliance (OHA), который занимается поддержкой и дальнейшим развитием платформы. Android позволяет создавать Java-приложения, управляющие устройством через разработанные Google библиотеки. Также есть возможность писать приложения на Си и других языках программирования с помощью Android Native Development Kit. Google предлагает для свободного скачивания инструментарий для разработки (Software Development Kit), который предназначен для x86-машин под операционными системами Windows XP, Windows Vista, Mac OS X и Linux [1]. Для разработки требуется JDK 5 или JDK 6. Разработку приложений для Android так же можно вести на языке Java. Существует плагин для IntelliJ IDEA - Android Development Tools.

Android основан на Linux. Между приложением и ядром лежит слой API и слой библиотек на нативном коде. Приложение выполняется на виртуальной машине Dalvik (Dalvik Virtual Machine). В Android можно запускать много приложений. Но одно из них есть главным, и занимает экран. От текущего приложения можно перейти к предыдущему или запустить новое. Это похоже на браузер с историей просмотров.

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

Каждый экран пользовательского интерфейса представлен классом Activity. Различные Activity содержатся в процессах. Activity может даже жить дольше процесса. Activity может быть приостановлена и запущена вновь с сохранением всей нужной информации как показано на рис. 2.1.

Платформа использует специальный механизм описания действий основанный на Intent. Когда нужно выполнить действие (сделать звонок, послать письмо, показать окно), вызывается Intent. Также Android содержит сервисы для выполнения нужных действий в фоновом режиме (например, проигрывание музыки). Для обмена данными между приложениями используются Content providers (провайдеры содержимого) [4].

t1588847988ae.png

Рисунок 2.1. Схема работы Android приложения

Приложения для Android являются программами в нестандартном байт-коде для виртуальной машины Dalvik - это входящая в состав Android операционная среда, интерпретирующая код приложений во время его исполнения [3]. Каждое приложение Android работает внутри экземпляра виртуальной машины, которая в свою очередь находится внутри процесса, управляемого ядром Linux, как показано на рис. 2..2.

t1588847988af.png

Рисунок 2.2. Виртуальная машина Dalvik

Платформа Android состоит из набора таких компонентов:

Операционная система на базе ядра Linux;

Среда программирования Java;

Цепочка инструментов: компилятор, компилятор ресурсов, отладчик и эмулятор;

Виртуальная машина Dalvik для исполнения приложений.

Для Android был разработан формат архивных исполняемых файлов-приложений - apk.

Первым устройством, работающим под управлением Android, стал разработанный компанией HTC смартфон T-Mobile G1, презентация которого состоялась 23 сентября 2008 года [9].

Внутренняя архитектура Android

Внутренняя архитектура Android делится на четыре уровня [8]:

Уровень ядра

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

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

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

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


Уровень ядра

Основные компоненты операционной системы Android и их взаимодействие между собой показаны на рисунке 2.3. Ядро является слоем абстракции между оборудованием и остальной частью программного стека. На этом уровне располагаются основные службы, такие как: управление процессами, распределение памяти и управление файловой сис­темой. Ядро Android основано на ядре Linux версии 2.6, но сама система Android не является Linux-системой в чистом виде, имеет некоторые отличия и содержит дополнительные расширения ядра, свои механизмы распределения памяти, взаимодействие между процессами. Основные компоненты уровня ядра [6]:

t1588847988ag.png

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

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

Приложения и службы работают в защищенных отдельных процессах, которые общаются между собой и имеют доступ к общим данным. Платформа Android обеспечивает механизм IPC (Inter-process Communication), который является основным механизмом взаимодействия между процессами. Драйвер IPC обеспечивает следующую функциональность [8]:

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

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

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

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

Драйвер управления питанием

Система управления энергопотреблением (Android Power Management) разработана на основе стандартного драйвера управления питанием Linux, но оп­тимизирована для мобильных устройств с учетом их специфических особен­ностей. Основная функция системы управления энергопотреблением − экономное использование батареи мобильного устройства. Драйвер переводит системы в «спящий режим» с минимальным потреблением мощности процессором, если приложения и службы не используются [11].

Набор драйверов для оборудования

Встроенные драйверы включают в себя поддержку работы с оборудованием мобильного устройства. Набор драйверов может быть различным в зависимости от производителя и модели устройства. Поскольку новое вспомогатель­ное оборудование для мобильных устройств постоянно появляется на рынке, драйверы для них должны быть написаны на уровне ядра Linux для обеспе­чения поддержки оборудования, так же как и для настольных Linux-систем.

Преимущество использования ядра Linux как основы Android в том, что ядро системы позволяет верхним уровням программного стека оставаться неиз­менными, несмотря на различия в используемом оборудовании.

Мобильное устройство Android поставляется с набором основных приложений, включая почтового клиента, программу для работы с SMS, календарь, навигационные карты, браузер, контакты. Платформа Android не делает разницы между основными приложениями телефона и сторонним программным обеспечением. Значить ключевые приложения, входящие в стандартный набор программного обеспечения, можно заменить альтернативными приложениями. Программы для Android пишутся на языке Java. Архитектура приложений по­строена так, чтобы было легко использовать основные компоненты, предос­тавляемые системой.

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

На этом уровне находятся основные службы Android для управления жизненным циклом приложений, пакетов, ресурсов. Службы Android − это службы, которые являются основными для всех приложений, работающих на устройстве. К ним относятся [14]:

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

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

менеджер окон - сохраняет окна приложения;

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

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

Уровень библиотек включает набор библиотек C/C++ используемых различными компонентами ОС. Доступ к функциям этих библиотек реализован через использование Application Framework − каркаса приложений. Android включает ряд библиотек, используемых различными компонентами системы [13].

Мультимедиа (Media Framework). Эти библиотеки ответственны за регистрацию и воспроизведение аудио и видеоформатов.

OpenGL − движок для работы с ЗD-графикой, позволяющая мобильным устройствам работать с тяжеловесными в графическом отношении приложениями.

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

WebKit − библиотека, предназначенная для функционирования встроенного в Android Web-браузера. WebKit поддерживает CSS, JavaScript, DOM,Ajax.

SGL − движок для работы с 2D-графикой. Android также поддерживает собственную графическую 2D-библиотеку Skia, которая написана на С. Skia также формирует ядро популярного браузера Google Chrome [29].

Основные компоненты приложения

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

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

Служба;

Приемник широковещательных намерений;

Контент-провайдер.

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

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

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

Приемник широковещательных намерений (Broadcast Receiver) − компонент для получения внешних событий и реакции на них. Инициализировать передачи могут другие приложения и службы. Приложение может иметь любой номер приемников широковещательных намерений, чтобы ответить на любые объявления, которые оно считает важными. Приемники широковещательных намерений не имеют пользовательского интерфейса. Однако они могут запустить деятельность в ответ на информацию, которую они получают, или показать уведомление, чтобы предупредить пользователя [20].

Контент-провайдер делает определенный набор данных, используемых приложением, доступным для других приложений. Данные могут быть сохранены в файловой системе, в базе данных SQLite. Контент-провайдер для безопасного доступа к данным используют механизм разрешений. Это означает, что можно конфигурировать собственные контент-провайдеры, чтобы разрешить доступ к своим данным из других приложений и использовать контент-провайдеры других приложений для обращения к их хранилищам данных [20].

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

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

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

Потоки и процессы

Когда хотя бы один из компонентов приложения (или все приложение) будет востребован, система Android запускает процесс, который содержит единст­венный основной поток для выполнения. По умолчанию все компоненты приложения работают в этом процессе и потоке. Однако можно принять меры, чтобы компоненты работали в других процессах и порождали дополнительные потоки для любого процесса [12].

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

Приоритет и статус процессов

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

t1588847988ah.png

Рисунок 2.4. Приоритет и статус процессов

Процессы с самой низкой важностью уничтожаются первыми. Есть пять уровней в иерархии важности [14].

Активный процесс (Foreground Process) − тот, который требуется для того, что пользователь в настоящее время делает. Процесс считается активным, если выполняется любое из следующих условий:

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

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

процесс имеет объект service, и выполняется один из методов обратного вызова, определенных в этом объекте;

процесс имеет объект BroadcastReceiver, и выполняется его метод обратного вызова для приема намерения.

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

Видимый процесс (Visible Process) – тот, который не имеет никаких при­оритетных компонентов. Компонент из этого процесса еще может вызываться пользователем. Процесс, как полагают, является видимым, если выполняется любое из следующих условий [13]:

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

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

Сервисный процесс (Service Process) − процесс, в котором выполняется служба и который не относится ни к одной из двух предыдущих категорий. Хотя сервисные процессы обычно не привязаны к интерфейсу, видимому пользователем, они выполняют задания, нужные пользователю, например фоновая работа медиаплеера или загрузка данных из сети, так что система сохраняет их при наличии свободной памяти наряду со всеми активными и видимыми процессами.

Фоновый процесс (Background Process) − процесс в котором выполняется деятельность, которую в настоящее время не видима пользователем. Эти процессы не имеют никакого прямого воздействия на пользовательский ввод и могут быть уничтожены в любое время, чтобы востребовать память для активного, видимого или сервисного процесса. Обычно имеется много фоновых процессов, они сохраняются в списке LRU (least recently used, «не использующиеся дольше всех»), чтобы гарантировать, что находящийся в конце этого списка процесс, в котором выполняется деятельность, был бы уничтожен в последнюю очередь.

Пустой процесс (Empty Process) − не содержит никаких активных компо­нентов приложения. Единственная причина сохранять такой процесс − только как кэш, чтобы уменьшить время запуска при вызове компонента. Система уничтожает эти процессы в первую очередь.

Если в одном процессе выполняются несколько компонентов, Android опре­деляет приоритет процесса по компоненту с самым высоким приоритетом. Например, если в процессе выполняется служба и видимая деятельность, процесс будет ранжирован как видимый, а не сервисный процесс.

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

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

Жизненный цикл процессов

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

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

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

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

Преимущества и недостатки Android платформы

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

Изначально, рассчитанная на использование в мобильных устройствах, ОС Android предоставляет пользователю многообразие приложений, обеспечивающих широкий набор возможностей. Компоненты Android делятся на группы:

Приложения для работы с сетью Интернет

Обработчики мультимедиа

Средства связи и управления контактами

Организационные средства

Утилиты

Игры

Среди базовых компонентов присутствуют средства связи и управления контактами, веб-браузер, основанный на современном и полноценном движке WebKit, приложения для работы с электронной почтой, плеер. Кроме базовых, на большинстве устройств Android имеется набор приложений от Google − Google Talk для обмена мгновенными сообщениями, приложение для работы с Gmail, YouTube, картами Google, Google-календарем, то есть с наиболее популярными сервисами интернет-гиганта.

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

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

Платформа базируется на Java, поэтому преимущества и возможности OS Linux на Андроиде практически не используются. Не применяется ни один из графических тулкитов и библиотек, что говорит о низкой вероятности появления большого количества приложений, портированных с настольного варианта Linux на эту ОС. Невозможность установки программного обеспечения на карту памяти телефона. Недостаток является существенным, если у коммуникатора малый объём встроенной памяти [35].

2.3. Установка Android SDK

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

Для разработки приложений, необходимо установить не менее одной версии платформы Android, используя Android SDK and AVD Manager. Это требует подключения к Интернету, так как все необходимые для загрузки и об­новления компоненты SDK находятся в репозитории на сервере Google. Чтобы открыть Android SDK and AVD Manager, необходимо запустить файл SDK Setup.exe в корневом каталоге SDK. После установки соединения с репозиторием в окне менеджера будет отображен список доступных пакетов. Выбрать необходимые пакеты и нажать кнопку Install Accepted и далее, следуя инструкциям, установить компоненты SDK. После успешной установки Android SDK, как показано на рис. 2.5 можно приступать к установке ADT-плагина для Eclipse [32].

t1588847988ai.png

Рисунок 2.5. Успешная установка SDK

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

API Android SDK − API-библиотеки Android, предоставляемые для разра­ботки приложений;

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

AVD (Android Virtual Device) − интерактивный эмулятор мобильного устройства Android. Используя эмулятор, можно запускать и тестировать приложения без использования реального Android-устройства.

Development Tools − SDK включает несколько инструментальных средств для разработки, которые позволяют компилировать и отлаживать создаваемые приложения.

Sample Code − Android SDK предоставляет типовые приложения, которые демонстрируют некоторые из возможностей Android, и простые программы, которые показывают, как использовать индивидуальные особенности API в вашем коде.

Перед началом разработки приложений для Android необходимо понять общий подход платформы к управлению изменением API. Также важно понять Android API Level (Идентификатор уровня API) и его роль в обеспечении совместимости вашего приложения с устройствами, на которых оно будет устанавливаться.

Уровень API − целочисленное значение, которое однозначно определяет версию API платформы Android. Платформа обеспечивает структуры API, которые приложения могут использовать для взаимодействия с системой Android. Каждая следующая версия платформы Android может включать обновления API.

Обновления API - структуры разработаны так, чтобы новый API оставался совместимым с более ранними версиями API. Таким образом, большинство изменений в API является совокупным и вводит новые функциональные возможности или исправляет предыдущие. Поскольку часть API постоянно обновляется, устаревшие API не рекомендуются к использованию, но не удаляются из соображений совместимости с имеющимися приложениями. Уровень API, который использует приложение для Android, определяется целочисленным идентификатором, который указывается в файле конфигурации каждого Android-приложения. Табл. 1 определяет соответствие уровня API и версии платформы Android [4].

Таблица 1.Соответствие версии платформы и уровня API

t1588847988aj.png

2.4. Инструменты для разработки и отладки приложений

Кроме эмулятора, SDK также включает множество других инструментальных средств для отладки и установки создаваемых приложений. SDK содержит еще ряд полезных инструментов для разработки и отладки приложений [5]:

Android - важный инструмент разработки, запускаемый из командной строки, который позволяет создавать, удалять и конфигурировать виртуальные устройства, создавать и обновлять Android-проекты (при работе вне среды Eclipse) и обновлять Android SDK новыми платформами, дополнениями и документацией;

Dalvik Debug Monitor Service (DDMS) − интегрированный с Dalvik Virtual Machine, стандартной виртуальной машиной платформы Android, этот инструмент позволяет управлять процессами на эмуляторе или устройстве, а также помогает в отладке приложений. Вы можете использовать этот сервис для завершения процессов, выбора определенного процесса для отладки, генерирования трассировочных данных, просмотра кучи или информации о потоках, делать скриншоты эмулятора или устройства;

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

Layoutopt - инструмент командной строки, который помогает оптимизи­ровать схемы разметки и иерархии разметок в создаваемом приложении. Необходим для решения проблем при создании сложных графических ин­терфейсов, которые могут затрагивать производительность приложения;

Draw 9-patch - графический редактор, который позволяет легко создавать NinePatch-графику для графического интерфейса разрабатываемых при­ложений;

Плагин Android Development Tools (ADT) - это расширение для интегриро­ванной среды разработки Eclipse, ускоряющее и упрощающее создание, и от­ладку приложений. Для установки Android Development Tools необходимо запустить Eclipse, затем выбрать пункт меню Help | Install New Software. В появившемся диалоговом окне нажать кнопку Add. После установки соединения пометить устанавливаемые компоненты ADT, как показано на рис. 2.6.

t1588847988ak.png

Рисунок 2.6. Инсталляция компонентов ADT

После завершения установки необходимо перезапустить среду. Теперь необходимо связать Eclipse с каталогом Android SDK. Необходимо выбрать в главном меню Eclipse пункт Window | Preferences, чтобы открыть диалоговое окно Preferences. Далее в левой панели пункт Android. В поле SDK Location в основной панели необходимо указать каталог, в котором расположен Android SDK нажав кнопку Browse и установить путь к каталогу Android SDK, как показано на рис. 2.7 [4].

t1588847988al.png

Рисунок 2.7. Связывание среды Eclipse с Android SDK

После нажатия кнопки Apply, IDE Eclipse устанавливает связь с библиотеками и инструментами Android SDK. ADT плагин для Eclipse автоматизирует и упрощает процесс построения приложений для Android, интегрируя инструменты разработки непосредственно в среду разработки, что делает создание, запуск и отладку приложений быстрее и проще.

Плагин к программе интегрирует в Eclipse следующие компоненты:

Мастер создания проекта Android - New Project Wizard, который упрощает создание новых проектов Android и формирует шаблон проекта;

Редактор Layout Editor − для разработки графического интерфейса приложения;

Редакторы ресурсов для создания, редактирования и проверки правильности XML-ресурсов разработчика.

ADT-плагин также предоставляет доступ к остальным инструментам платформы внутри IDE. Например, ADT позволяет запускать эмулятор мобильного устройства, получить доступ ко многим возможностям DDMS (Dalvik Debug Monitor Service) − инструмента SDK для управления портами, настройки контрольных точек (breakpoints), просмотра информации о потоках и процес­сах непосредственно из среды Eclipse.

2.5. Установка Eclipse

Eclipse – свободная интегрированная среда разработки модульных кроссплатформенных приложений. Развивается и поддерживается Eclipse Foundation.

Наиболее известные приложения на основе Eclipse Platform - различные «Eclipse IDE» для разработки ПО на множестве языков (например, наиболее популярный «Java IDE», поддерживавшийся изначально, не полагается на какие-либо закрытые расширения, использует стандартный открытый API для доступа к Eclipse Platform).

Eclipse служит в первую очередь платформой для разработки расширений, чем он и завоевал популярность: любой разработчик может расширить Eclipse своими модулями. Уже существуют Java Development Tools (JDT), C/C++ Development Tools (CDT), разрабатываемые инженерами QNX совместно с IBM, и средства для языков Ada (GNATbench, Hibachi), COBOL, FORTRAN, PHP и пр. от различных разработчиков. Множество расширений дополняет среду Eclipse менеджерами для работы с базами данных, серверами приложений и др.

Eclipse JDT (Java Development Tools) - наиболее известный модуль, нацеленный на групповую разработку: среда интегрирована с системами управления версиями - CVS, GIT в основной поставке, для других систем (например, Subversion, MS SourceSafe) существуют плагины. Также предлагает поддержку связи между IDE и системой управления задачами (ошибками). В основной поставке включена поддержка трекера ошибок Bugzilla, также имеется множество расширений для поддержки других трекеров (Trac, Jira и др.). В силу бесплатности и высокого качества, Eclipse во многих организациях является корпоративным стандартом для разработки приложений [12].

Eclipse написана на Java, потому является платформо-независимым продуктом, за исключением библиотеки SWT, которая разрабатывается для всех распространённых платформ. Библиотека SWT используется вместо стандартной для Java библиотеки Swing. Она полностью опирается на нижележащую платформу (операционную систему), что обеспечивает быстроту и натуральный внешний вид пользовательского интерфейса, но иногда вызывает на разных платформах проблемы совместимости и устойчивости приложений

Установка:

Распаковываем содержимое архива с Eclipse  и кладем папку Eclipse на диск C: (Eclipse может работать некорректно, если в пути до его папки использвуются пробелы). Запускаем Eclipse. Указываем workspace для Eclipse (рис. 2.8).

t1588847988am.png

Рисунок. 2.8. Распаковка содержимого архива с Eclipse

Переходим во вкладку «Help» и выбираем пункт «Install new software». Нажимаем клавишу «add» и добавляем новый репозиторий (Name: ADT, Location:https://dl-ssl.google.com/android/eclipse/) и нажимаем «OK» (рис. 2.9).

t1588847988an.png

Рисунок. 2.9. Добавление нового репозитория

Выбираем новый ресурс и через несколько секунд появятся новые доступные пакеты, ставим галочку около «Developer Tools» и нажимаем «Next» (рис. 2.10).

t1588847988ao.png

Рисунок. 2.10. Выбор пакета «Developer Tools»

После установки пакетов Android для Eclipce, в появившимся окне указать путь до Android SDK и нажать «Next» (рис. 2.11).

t1588847988ap.png

Рисунок. 2.11. Связывание Eclipce с Android SDK

Выводы к Главе 2

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



ГЛАВА III. РАЗРАБОТКА И РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ СЭЙВЕРОМ ИЗОБРАЖЕНИЙ И ВИДЕО «TOTAL» 3.1. UML диаграммы

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

определить общие границы и контекст моделируемой предметной области;

сформулировать общие требования к функциональному поведению проектируемой системы;

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

подготовить исходную документацию для взаимодействия разработчиков системы с ее заказчиками и пользователями [10].

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

t1588847988aq.png

Рисунок 3.1. Диаграмма вариантов использования

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

Отношение расширения между вариантами использования обозначается пунктирной линией со стрелкой (вариант отношения зависимости), направленной от того варианта использования, который является расширением для исходного варианта использования. Данная линия со стрелкой помечается ключевым словом «extend» (расширяет).

Отношение обобщения служит для указания того факта, что некоторый вариант использования А может быть обобщен до варианта использования В

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

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

Диаграмма классов UML

Диаграммы классов используются при моделировании ПС наиболее часто. Они являются одной из форм статического описания системы с точки зрения ее проектирования, показывая ее структуру. Диаграмма классов не отображает динамическое поведение объектов изображенных на ней классов. На диаграммах классов показываются классы, интерфейсы и отношения между ними.

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

t1588847988ar.png

Рисунок 3.2. Диаграмма классов UML

Создание схемы последовательности

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

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

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

Вторым измерением диаграммы последовательности является вертикальная временная ось, направленная сверху вниз. Начальному моменту времени соответствует самая верхняя часть диаграммы. Взаимодействия объектов реализуются посредством сообщений, которые посылаются одними объектами другим. Сообщения изображаются в виде горизонтальных стрелок с именем сообщения, а их порядок определяется временем возникновения. То есть, сообщения, расположенные на диаграмме последовательности выше, инициируются раньше тех, которые расположены ниже. Масштаб на оси времени не указывается, поскольку диаграмма последовательности моделирует лишь временную упорядоченность взаимодействий типа «раньше-позже».

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

t1588847988as.png

Рисунок 3.3. Схема последовательности

Диаграмма деятельности UML

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

Таким образом, диаграммы деятельности (рис. 5) можно считать частным случаем диаграмм состояний. Они позволяют реализовать в языке UML особенности процедурного и синхронного управления, обусловленного завершением внутренних деятельностей и действий. Основным направлением использования диаграмм деятельности является визуализация особенностей реализации операций классов, когда необходимо представить алгоритмы их выполнения.

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

t1588847988at.png

Рисунок 3.4. Схема активности

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

3.2. Средства разработки сэйвера «Total»

Среда разработки

Разработанный сэйвер был создан в среде разработки Eclipse. Eclipse - это расширяемая среда разработки (Integrated Development Environment, далее IDE) с открытым исходным кодом (рис. 3.4).

t1588847988au.png

Рисунок 3.4. Среда разработки Eclipse

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

Проект «The Eclipse» (http://www.eclipse.org/eclipse/index.html)  непосредственно Eclipse IDE (платформы, содержащей и исполняющей инструменты Eclipse), инструментов разработки для Java (Java Development Tools) и среды разработки Plug-In (Plug-In Development Environment), позволяющих расширять платформу.

Проект «Eclipse Tools» (http://www.eclipse.org/tools/index.html) имеет своей целью создание инструментов для платформы Eclipse (в текущей разработке находятся подпроекты создания IDE для Cobol, IDE для C/C++, а также инструмента для построения EMF моделей).

Проект «The Eclipse Technology» (http://www.eclipse.org/technology/index.html) ответственен за технологические разработки, эволюцию и обучение использованию платформы Eclipse.

Платформа Eclipse в сочетании с JDT включает многие из возможностей, которые включаются в коммерческие IDE:

редактор с подсветкой синтаксиса;

инкрементальная компиляция кода;

потокобезопасный отладчик;

навигатор по классам;

менеджеры файлов и проектов, а также интерфейсы к стандартным системам контроля исходных текстов, таким как CVS и ClearCase [31].

Также Eclipse предлагает множество уникальных возможностей, например рефакторинг кода (http://www.refactoring.com), автоматическое обновление/установка кода (с помощью Менеджера Обновлений), список текущих задач, отладку модулей с помощью JUnit (http://www.junit.org) и интеграцию с инструментом компоновки Jakarta Ant(http://jakarta.apache.org/ant/index.html).

Несмотря на большое число стандартных возможностей, Eclipse отличается от традиционных IDE по ряду особенностей. Наверное, самое интересное в Eclipse то, что она полностью независима от платформы и языка. Помимо языков, поддерживаемых консорциумом в настоящий момент (Java, Cobol, C/C++), ведутся разработки по добавлению в Eclipse поддержки таких языков, как Python, Eiffel, PHP, Ruby, и C#.

Консорциум предоставляет готовые исполняемые файлы для Windows, Linux, Solaris, HP-UX, AIX, QNX и Mac OS X. Большой интерес в Eclipse представляет plug-in архитектура, а также богатый API, предоставляемый PDE, позволяющий расширять Eclipse. Добавление поддержки для нового редактора, представления или языка программирования является достаточно простым, благодаря грамотно разработанным API и большим строительным блокам, предоставляемым Eclipse [20].

Учитывая сотни проектов по разработке plug-in, ведущихся в настоящее время, таких индустриальных гигантов как IBM, HP и Rational, предоставляющих ресурсы, а также проектных тяжеловесов вроде Erich Gamma, помогающих направлять процесс эволюции в нужное русло - у Eclipse большое будущее.

Структура проекта

ADT-плагин при создании проекта организует структуру в виде дерева каталогов, как и любой другой проект Java. В среде Eclipse, в окне Package Explorer, можно видеть структуру созданного проекта рис. 3.5.

t1588847988av.png

Рисунок 3.5. Окно Package Explorer в Eclipse

При компиляции в каталоге проекта создается папка bin/. Откомпилированный код Java-классов вместе с файлами данных и ресурсов помещается в архивный файл с расширением арк. Этот файл используется для распространения приложения и установки его на мобильных устройствах.

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

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

res/drawable/ − для изображений (PNG, JPEG );

res/layout/ − для XML-файлов разметки (компоновка графических элементов управления для окон приложения);

res/menu/ − для XML-файлов меню;

res/values/ − для строковых ресурсов, массивов;

res/xml/ − для других XML-файлов, которые понадобятся для разработки приложения.

Следует отметить несколько ограничений относительно создания папок файлов ресурсов. Во-первых, Android поддерживает только линейный список файлов в пределах предопределенных папок под каталогом res/. Например, он не поддерживает вложенные папки под папкой для XML-файлов разметки.

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

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

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

В этом каталоге размещаются все графические файлы, используемые в приложении. На данный момент там есть только файл icon.jpg − значок прило­жения, по умолчанию устанавливаемый для приложения мастером создания проекта и отображаемый в меню запуска установленных на телефоне прило­жений (Application Launcher). Подкаталог res/values − в этой папке хранятся общие константы для всего приложения: текст, используемый элементами управления, цвета, стили.

Файл R.java

Когда проект компилируется первый раз, среда создает класс R и помещает его в файл R.java. Этот класс используется в коде программы для обращения к ресурсам, которые находятся в каталоге res/.

Класс R содержит набор внутренних классов с идентификаторами ресурсов, которые он создает в зависимости от внутреннего содержимого каталога res/:

drawabie − для каталога res/drawable/;

layout − для каталога res/layout/. Содержит идентификаторы файлов разметки − main.xml, сгенерированный мастером создания проекта. Если в приложении определены несколько деятельностей, для каждой из них необходимо будет определять файл разметки;

id − для идентификаторов компонентов разметки, определенных в файле main.xml;

string − для идентификаторов строк в файле strings.xml.

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

Файл AndroidManifest.xml

Манифест - структурный XML-файл, всегда имеет название AndroidManifest.xml для всех приложений. Он задает конфигурацию приложения, объявляет компоненты приложения, перечисляет любые библиотеки, связанные с приложением, и объявляет разрешения, которые приложение предоставляет. Файл манифеста описывает всю архитектуру Android-приложения, его функциональные возможности и конфигурацию. На рисунке 12 приведена общая структура файла манифеста и элементов, которые содержатся в нем, и назначение каждого из элементов.

Порядок расположения элементов, находящихся на одном уровне, произ­вольный. Все значения устанавливаются через атрибуты элементов. Элемент <application> является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Элементы <manifest>, <appiication> и <uses-sdk> являются обязательными. Другие элементы используются по мере необходимости.

Элемент <manifest> является корневым элементом файла AndroidManifest.xml. По умолчанию мастер создания проекта Android в Eclipse создает элемент с четырьмя атрибутами:

xmlns: android − определяет пространство имен Android. Это значение всегда неизменно для всех приложений;

package − определяет имя пакета приложения, которое вы определили при создании приложения;

android:versionCode − указывает внутренний номер версии;

android:versionName − указывает номер пользовательской версии. Этот атрибут может быть установлен как строка или как ссылка на строковый ресурс.

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

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

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

android:name − имя класса. Имя должно включать полное обозначение пакета, но так как. имя пакета уже определено в корневом элементе <manifest>, имя класса, реализующего деятельность, можно записывать в сокращенном виде, опуская имя пакета.

android: label − текстовая метка, отображаемая пользователю.


t1588847988aw.png

Рис. 1.6. Структура файла манифеста

Атрибут android:name элемента <activity> вызывает подкласс Activity, который реализует деятельность (окно) в приложении. Атрибуты icon и label прикрепляют файлы ресурсов, содержащих значок и текст, которые могут быть отображены пользователю.

Кроме вышеперечисленных, элемент <activity> содержит множество атрибутов, определяющих разрешения, ориентацию экрана. Если приложение содержит несколько деятельностей, нужно объявлять их в манифесте, создавая для каждой из них свой элемент <activity>. Если деятельность не объявлена в манифесте, она не будет видна системе и не будет запущена при выполнении приложения.

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

объявляет имя Java-пакета данного приложения. Имя пакета служит уникальным идентификатором для приложения;

описывает компоненты приложения − деятельности, службы, приемники широковещательных намерений и контент-провайдеры, из которых приложение состоит. Он вызывает классы, которые реализуют каждый из компонентов, и объявляет их намерения. Эти объявления позволяют системе Android знать, чем компоненты являются и при каких условиях они могут быть запущены;

объявляет, какие разрешения должно иметь приложение для обращения к защищенным частям API и взаимодействия с другими приложениями;

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

объявляет минимальный уровень API Android, которого требует приложение;

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

Редактировать файл манифеста можно вручную, записывая XML-код непо­средственно в файл или через визуальный редактор. Для работы с файлом манифеста в есть отдельный инструмент − Manifest Editor (редактор файла манифеста), который позволяет визуальное и текстовое редактирование файла манифеста приложения [14].

3.3. Руководство пользователя приложением «Total»

Приложение «Total», созданное под операционную систему Android,  представляется как интерфейс пользователя для работы с файловой системой и файлами мобильного телефона. Файловый менеджер «Total» (рис. 3.7) позволяет выполнять наиболее частые операции над файлами:

Создание;

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

Редактирование;

Перемещение;

Переименование;

Копирование;

Удаление;

Поиск файлов.

t1588847988ax.png

Рисунок 3.7. Приложение «Total»

В верхней части экрана располагается меню приложения (рис. 3.8)

t1588847988ay.png

Рисунок 3.8. Меню приложения «Total»

Меню разделено на шесть вкладок:

Кнопка назад;

Корневая директория;

Панель инструментов;

Инструменты для копирования, перемещения, удаления файлов;

Информация каталога;

Контактная информация [Приложение А].

Реализация:

Был создан метод для обработки нажатия на каждую кнопку меню. Так как приложение создавалось на языке программирования Java, то было решено использовать оператор switch, который  обеспечивает ясный способ переключения между различными частями программного кода в зависимости от значения одной переменной или выражения (листинг 1).

switch(v.getId()) {

case R.id.back_button:

if (mFileMang.getCurrentDir() != "/") {

if(multi_select_flag) {

mDelegate.killMultiSelect(true);

Toast.makeText(mContext, "Multi-select is now off",

Toast.LENGTH_SHORT).show();

}

stopThumbnailThread();

updateDirectory(mFileMang.getPreviousDir());

if(mPathLabel != null)

mPathLabel.setText(mFileMang.getCurrentDir());

}

break;

case R.id.home_button:

if(multi_select_flag) {

mDelegate.killMultiSelect(true);

Toast.makeText(mContext, "Multi-select is now off",

Toast.LENGTH_SHORT).show();

}

stopThumbnailThread();

updateDirectory(mFileMang.setHomeDir("/sdcard"));

if(mPathLabel != null)

mPathLabel.setText(mFileMang.getCurrentDir());

break;

case R.id.info_button:

Intent info = new Intent(mContext, DirectoryInfo.class);

info.putExtra("PATH_NAME", mFileMang.getCurrentDir());

mContext.startActivity(info);

break;

case R.id.help_button:

Intent help = new Intent(mContext, HelpManager.class);

mContext.startActivity(help);

break; }

Листинг 1. Метод для обработки нажатия кнопок меню

В панели инструментов реализованы две опции:

Просмотр запущенных процессов системы;

Резервное копирование каталога.

Окно панели инструментов запускается в виде диалогового окна. Называется она «Tool Box» (рис. 3.9).

t1588847988az.png

Рисунок 3.9. Панель инструментов «Tool Box»

«Process Info» - просмотр всех запущенных приложений операционной системы Android, которые запускаются сразу при включении смартфона. Все это необходимо для того, чтобы можно было освободить память и уменьшить нагрузку на батарею, отключив ненужные программы из автозагрузки (рис. 3.10).

t1588847988ba.png

Рисунок 3.10. «Process Info»

«Application backup» - резервное копирование всех файлов выбранного каталога в корневую директорию в папку «Open Manager» [Приложение Б].

При нажатии на подменю «Информация каталога» появится новое окно, в котором пользователь имеет возможность просмотреть дату создания, изменения папки или файла, узнать абсолютный путь файла, количество файлов в каталоге. Для наглядности каждый каталога нумеруется (рис. 3.11).

t1588847988bb.png

Рисунок 3.11. Информация каталога

При нажатии на подменю «Контактная информация», появится диалоговое окно, в котором отображена информация о разработчике, его имя, email, веб-сайт (рис. 3.12).

t1588847988bc.png

Рисунок 3.12. Контактная информация

Выводы к Главе 3

В данной главе были рассмотрены средства разработки приложения «Total» для мобильного телефона на базе Android. Рассмотрена среда разработки Eclipse, построены UML диаграммы. Рассмотрено подробное руководство пользователя приложения, были обозначены основные опции программы.


ЗАКЛЮЧЕНИЕ

Android OS - это операционная система для мобильных устройств, в основе которой лежит виртуальная машина Dalvik, запущенная на ядре Linux. Dalvik по своей сути является аналогом Java Virtual Machine, и разработка программ для нее также ведется на языке Java.

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

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

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

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

В ходе выполнения работы были подведены следующие итоги:

Проанализирована литература по объектно-ориентированному языку программирования Java, мобильной платформе Android, и среде программирования Eclipce, которую разработала компанией JetBrains. Данная среда завоевала большую популярность среди программистов благодаря полной открытости своих исходных кодов.

Принципы работы мобильной ОС Android основаны на ядре Linux. Приложения в данной среде выполняются на виртуальной машине Dalvik - это входящая в состав Android операционная среда, интерпретирующая код приложений во время его исполнения. Каждое приложение Android работает внутри экземпляра виртуальной машины, которая в свою очередь находится внутри процесса, управляемого ядром.

Установлена и настроена кроссплатформенная интегрированная среда разработки Eclipce, которая позволяет создавать Java приложения для мобильных устройств, работающих под управлением Android.

Установлен и настроен эмулятор Android Virtual Device, который используется для проектирования, отладки и тестирования приложений в реальной среде выполнения;

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



СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

Android life. Описание, перспективы, разработка. [Электронный ресурс]. – Режим доступа: http://android life.ru/article/2-android-sdk-tools.html

Chris Haseman. Andrioid Essentials / Ch. Haseman. – NY.: Apress, 2010. – 415c. – ISBN 07- 1- 569100194

Frederick Phillips. The mythical man-month: essays on software engineering . - Anniversary ed. - 1995. 322 с.

Habrahabr. Подробное руководство по установке Android - x86. [Электронный ресурс]. – Режим доступа: http://habrahabr.ru/blogs/android_development/109944/

Habrahabr. Приложение на Android. [Электронный ресурс]. – Режим доступа: http://habrahabr.ru/blogs/android_development/109944/

Jerome DiMarzio. Android. A programmers guide / J.F DiMarzio. – NY.: The McGraw-Hill Companies, 2008. – 319с. – ISBN 0-07-159989-4

Soft Android. [Электронный ресурс]. – Режим доступа: http://softandroid.ru/index.php

Абрамов Е. Android Developers. Нюансы и хитрости / Е. Абрамов. – СПб.: Питер, 2011. – 480с: ил. - ISBN 735-8459-1759-5

Аккуратов Е. Знакомтесь: Java. Самоучитель / Е.Е. Аккуратов. – М.: Вильямс, 2006. – 230с. - ISBN: 5-8459-0957-0

Леоненков А. Самоучитель UML. / А. Леоненко. - СПб.: Питер, 2007. - 576 с

Арнольд К. Язык программирования Java / К. Арнольд, Дж. Гослинг. – СПб.: Питер, 2002. – 225с. – ISBN 585-684-2480:9.00

Барнет Э. Eclipse IDE. Карманный справочник. / Э. Барнед.- СПб.: КУДИЦ – Образ, 2006. – 160с. - ISBN 5-91136-007-1

Буткевич Е.Л. Пишем программы и игры для сотовых телефонов / Е.Л. Буткевич. – СПб.: Питер, 2006. – 204с. – ISBN 5-469-01139-9

Голощапов А.Л. Google Andrioid. Программирование для мобильных устройств / A.Л. Голощапов. – СПб.: БХВ-Петербург, 2011. – 448 с. ISBN 978-5-9775-0562-8

Горнаков С. Программирование мобильных телефонов на Java. / С. Горнаков. – М.: ДМК Пресс, 2008. – 512с: ил. ISBN 5-94074-409-5

Давыдов С.А. IntelliJ Idea. Профессинальное программирование на Java. / С.А. Давыдов. – СПб.: БХВ-Петербург,2005.- 800с. – ISBN 5-94157-607-2

Дейв Кросс. Справочник по Photoshop CS2. / Кросс Дейв. – СПб.: Санкт-Петербург, НТ Пресс, 2007. - 436 с

Ковтанюк Ю.С. Corel Draw 12: официальная русская версия. Руководство пользователя / Ю. С. Ковтанюк. - Спб.: Киев: «МК-Пресс», 2006. - 123 с

Коматинэни С. Google Android: программирование для мобильных устройств Pro Android 2. - 1-е изд. / Д. Маклин, C. Хэшими - CПб.: Питер, 2011. – 736 c.

Маасен О. Java. Пособие для разработчиков мобильных приложений / О. Маасен. – М.: МЭИ, 2009.- 608с. - ISBN 8-8452-0214-7

Пореев В.Н. Компьютерная графика. Учебное пособие. / В. Н. Пореев. - СПб.: BHV-Санкт-Петербург, 2002. – 432 с

Роджерс Д. Математические основы машинной графики. / Д. Роджерс, Дж. Адамс. - М.:Мир, 2001, ISBN 5-03-002143-4

Роджерс Р. Android. Разработка приложений / Р. Роджерс, Дж. Ломбардо, Б. Мейк. - М.: ЭКОМ Паблишерз, 2010. - 400 с. - ISBN 978-5-9790-0113-5

Силва В. Pro Android Games / В. Силва. - NY.: Apress, 2009. – 298с. – ISBN 177-1-4302-2647-5

Фаулер М. UML. Основы. Краткое руководство по унифицированному языку моделирования. 2-е издание / Фаулер М., Скотт К. – M.: Символ-Плюс, 2002. - 192 с

Фишер Т. Р. Java. Карманный справочник / Т.Р. Фишер. - М.: Вильямс, 2008. – 224 с. - ISBN 978-5-8459-1392-0

Хемраджани А. Гибкая разработка приложений на Java с помощью Spring, Hibernate и Eclipse / А. Хемраджани. - М.: Вильямс, 2008. – 352с.- ISBN 978-5-8459-1375-3

Хорстманн К. Том 1. Основы Java / К. Хорстманн. – М.:Вильямс, 2012. – 816с. – ISBN 985-5-8459-1378-4

Шилдт Г. Java. Полное руководство. / Г.Шилдт. – М.:Вильямс,2013. – 1104с. - ISBN 978-5-8459-1759-1

Шилдт Г. Java: руководство для начинающих. / Г.Шилдт. – М.:Вильямс,2012. – 624с. - ISBN 978-5-8459-1770-6

Эйнджел Э. Интерактивная компьютерная графика. Вводный курс. Второе издание./ Э. Эйнджел. - Сп-б.: Киев, Издательский Дом «Вильямс», 2001

Эккель Б. Философия Java. / Б. Эккель. – СПб.: Питер, 2009. – 638с. – ISBN 789-5-388-0003-3

Брауде Э. Технология разработки программного обеспечения. / Э. Брауде. - Спб.: Питер, 2004. - 655 с




Приложение А. Класс FileManager.java

package com.nexes.manager;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Comparator;

import java.util.Stack;

import java.io.File;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.zip.ZipEntry;

import java.util.zip.ZipInputStream;

import java.util.zip.ZipOutputStream;

import android.util.Log;

public class FileManager {

private static final int BUFFER = 2048;

private static final int SORT_NONE = 0;

private static final int SORT_ALPHA = 1;

private static final int SORT_TYPE = 2;

private static final int SORT_SIZE = 3;

private boolean mShowHiddenFiles = false;

private int mSortType = SORT_ALPHA;

private long mDirSize = 0;

private Stack<String> mPathStack;

private ArrayList<String> mDirContent;

public FileManager() {

mDirContent = new ArrayList<String>();

mPathStack = new Stack<String>();

mPathStack.push("/");

mPathStack.push(mPathStack.peek() + "sdcard");

}

public String getCurrentDir() {

return mPathStack.peek();

}

public ArrayList<String> setHomeDir(String name) {

mPathStack.clear();

mPathStack.push("/");

mPathStack.push(name);

return populate_list();

}

public void setShowHiddenFiles(boolean choice) {

mShowHiddenFiles = choice;

}

public void setSortType(int type) {

mSortType = type;

}

public ArrayList<String> getPreviousDir() {

int size = mPathStack.size();

if (size >= 2)

mPathStack.pop();

else if(size == 0)

mPathStack.push("/");

return populate_list();

}

public ArrayList<String> getNextDir(String path, boolean isFullPath) {

int size = mPathStack.size();

if(!path.equals(mPathStack.peek()) && !isFullPath) {

if(size == 1)

mPathStack.push("/" + path);

else

mPathStack.push(mPathStack.peek() + "/" + path);

}

else if(!path.equals(mPathStack.peek()) && isFullPath) {

mPathStack.push(path);

}

return populate_list();

}

public int copyToDirectory(String old, String newDir) {

File old_file = new File(old);

File temp_dir = new File(newDir);

byte[] data = new byte[BUFFER];

int read = 0;

if(old_file.isFile() && temp_dir.isDirectory() && temp_dir.canWrite()){

String file_name = old.substring(old.lastIndexOf("/"), old.length());

File cp_file = new File(newDir + file_name);


try {

BufferedOutputStream o_stream = new BufferedOutputStream(

new FileOutputStream(cp_file));

BufferedInputStream i_stream = new BufferedInputStream(

new FileInputStream(old_file));

while((read = i_stream.read(data, 0, BUFFER)) != -1)

o_stream.write(data, 0, read);

o_stream.flush();

i_stream.close();

o_stream.close();

} catch (FileNotFoundException e) {

Log.e("FileNotFoundException", e.getMessage());

return -1;

} catch (IOException e) {

Log.e("IOException", e.getMessage());

return -1;

}

}else if(old_file.isDirectory() && temp_dir.isDirectory() && temp_dir.canWrite()) {

String files[] = old_file.list();

String dir = newDir + old.substring(old.lastIndexOf("/"), old.length());

int len = files.length;

if(!new File(dir).mkdir())

return -1;

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

copyToDirectory(old + "/" + files[i], dir);

} else if(!temp_dir.canWrite())

return -1;

return 0;

}

public void extractZipFilesFromDir(String zipName, String toDir, String fromDir) {

if(!(toDir.charAt(toDir.length() - 1) == '/'))

toDir += "/";

if(!(fromDir.charAt(fromDir.length() - 1) == '/'))

fromDir += "/";

String org_path = fromDir + zipName;

extractZipFiles(org_path, toDir);

}

public void extractZipFiles(String zip_file, String directory) {

byte[] data = new byte[BUFFER];

String name, path, zipDir;

ZipEntry entry;

ZipInputStream zipstream;

if(!(directory.charAt(directory.length() - 1) == '/'))

directory += "/";

if(zip_file.contains("/")) {

path = zip_file;

name = path.substring(path.lastIndexOf("/") + 1,

path.length() - 4);

zipDir = directory + name + "/";

} else {

path = directory + zip_file;

name = path.substring(path.lastIndexOf("/") + 1,

path.length() - 4);

zipDir = directory + name + "/";

}

new File(zipDir).mkdir();

try {

zipstream = new ZipInputStream(new FileInputStream(path));

while((entry = zipstream.getNextEntry()) != null) {

String buildDir = zipDir;

String[] dirs = entry.getName().split("/");

if(dirs != null && dirs.length > 0) {

for(int i = 0; i < dirs.length - 1; i++) {

buildDir += dirs[i] + "/";

new File(buildDir).mkdir();

}

}

int read = 0;

FileOutputStream out = new FileOutputStream(

zipDir + entry.getName());

while((read = zipstream.read(data, 0, BUFFER)) != -1)

out.write(data, 0, read);

zipstream.closeEntry();

out.close();

}


} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public void createZipFile(String path) {

File dir = new File(path);

String[] list = dir.list();

String name = path.substring(path.lastIndexOf("/"), path.length());

String _path;

if(!dir.canRead() || !dir.canWrite())

return;

int len = list.length;

if(path.charAt(path.length() -1) != '/')

_path = path + "/";

else

_path = path;

try {

ZipOutputStream zip_out = new ZipOutputStream(

new BufferedOutputStream(

new FileOutputStream(_path + name + ".zip"), BUFFER));

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

zip_folder(new File(_path + list[i]), zip_out);


zip_out.close();

} catch (FileNotFoundException e) {

Log.e("File not found", e.getMessage());


} catch (IOException e) {

Log.e("IOException", e.getMessage());

}

}

public int renameTarget(String filePath, String newName) {

File src = new File(filePath);

String ext = "";

File dest;

if(src.isFile())

ext = filePath.substring(filePath.lastIndexOf("."), filePath.length());

if(newName.length() < 1)

return -1;

String temp = filePath.substring(0, filePath.lastIndexOf("/"));

dest = new File(temp + "/" + newName + ext);

if(src.renameTo(dest))

return 0;

else

return -1;

}

public int createDir(String path, String name) {

int len = path.length();

if(len < 1 || len < 1)

return -1;

if(path.charAt(len - 1) != '/')

path += "/";

if (new File(path+name).mkdir())

return 0;

return -1;

}

public int deleteTarget(String path) {

File target = new File(path);

if(target.exists() && target.isFile() && target.canWrite()) {

target.delete();

return 0;

}

else if(target.exists() && target.isDirectory() && target.canRead()) {

String[] file_list = target.list();

if(file_list != null && file_list.length == 0) {

target.delete();

return 0;

} else if(file_list != null && file_list.length > 0) {

for(int i = 0; i < file_list.length; i++) {

File temp_f = new File(target.getAbsolutePath() + "/" + file_list[i]);


if(temp_f.isDirectory())

deleteTarget(temp_f.getAbsolutePath());

else if(temp_f.isFile())

temp_f.delete();

}

}

if(target.exists())

if(target.delete())

return 0;

}

return -1;

}

public boolean isDirectory(String name) {

return new File(mPathStack.peek() + "/" + name).isDirectory();

}

public static String integerToIPAddress(int ip) {

String ascii_address = "";

int[] num = new int[4];

num[0] = (ip & 0xff000000) >> 24;

num[1] = (ip & 0x00ff0000) >> 16;

num[2] = (ip & 0x0000ff00) >> 8;

num[3] = ip & 0x000000ff;

ascii_address = num[0] + "." + num[1] + "." + num[2] + "." + num[3];

return ascii_address;

}

public ArrayList<String> searchInDirectory(String dir, String pathName) {

ArrayList<String> names = new ArrayList<String>();

search_file(dir, pathName, names);

return names;

}

public long getDirSize(String path) {

get_dir_size(new File(path));

return mDirSize;

}

private static final Comparator alph = new Comparator<String>() {

@Override

public int compare(String arg0, String arg1) {

return arg0.toLowerCase().compareTo(arg1.toLowerCase());

}

};

private final Comparator size = new Comparator<String>() {

@Override

public int compare(String arg0, String arg1) {

String dir = mPathStack.peek();

Long first = new File(dir + "/" + arg0).length();

Long second = new File(dir + "/" + arg1).length();

return first.compareTo(second);

}

};

private final Comparator type = new Comparator<String>() {

@Override

public int compare(String arg0, String arg1) {

String ext = null;

String ext2 = null;

int ret;

try {

ext = arg0.substring(arg0.lastIndexOf(".") + 1, arg0.length()).toLowerCase();

ext2 = arg1.substring(arg1.lastIndexOf(".") + 1, arg1.length()).toLowerCase();

} catch (IndexOutOfBoundsException e) {

return 0;

}

ret = ext.compareTo(ext2);

if (ret == 0)

return arg0.toLowerCase().compareTo(arg1.toLowerCase());

return ret;

}

};

private ArrayList<String> populate_list() {

if(!mDirContent.isEmpty())

mDirContent.clear();

File file = new File(mPathStack.peek());

if(file.exists() && file.canRead()) {

String[] list = file.list();

int len = list.length;

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

if(!mShowHiddenFiles) {

if(list[i].toString().charAt(0) != '.')

mDirContent.add(list[i]);

} else {

mDirContent.add(list[i]);

}

}

switch(mSortType) {

case SORT_NONE:

break;

case SORT_ALPHA:

Object[] tt = mDirContent.toArray();

mDirContent.clear();

Arrays.sort(tt, alph);

for (Object a : tt){

mDirContent.add((String)a);

}

break;

case SORT_SIZE:

int index = 0;

Object[] size_ar = mDirContent.toArray();

String dir = mPathStack.peek();

Arrays.sort(size_ar, size);

mDirContent.clear();

for (Object a : size_ar) {

if(new File(dir + "/" + (String)a).isDirectory())

mDirContent.add(index++, (String)a);

else

mDirContent.add((String)a);

}

break;

case SORT_TYPE:

int dirindex = 0;

Object[] type_ar = mDirContent.toArray();

String current = mPathStack.peek();

Arrays.sort(type_ar, type);

mDirContent.clear();

for (Object a : type_ar) {

if(new File(current + "/" + (String)a).isDirectory())

mDirContent.add(dirindex++, (String)a);

else

mDirContent.add((String)a);

}

break;

}

} else {

mDirContent.add("Emtpy");

}

return mDirContent;

}

private void zip_folder(File file, ZipOutputStream zout) throws IOException {

byte[] data = new byte[BUFFER];

int read;

if(file.isFile()){

ZipEntry entry = new ZipEntry(file.getName());

zout.putNextEntry(entry);

BufferedInputStream instream = new BufferedInputStream(

new FileInputStream(file));


while((read = instream.read(data, 0, BUFFER)) != -1)

zout.write(data, 0, read);

zout.closeEntry();

instream.close();

} else if (file.isDirectory()) {

String[] list = file.list();

int len = list.length;

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

zip_folder(new File(file.getPath() +"/"+ list[i]), zout);

}

}

private void get_dir_size(File path) {

File[] list = path.listFiles();

int len;

if(list != null) {

len = list.length;

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

try {

if(list[i].isFile() && list[i].canRead()) {

mDirSize += list[i].length();


} else if(list[i].isDirectory() && list[i].canRead() && !isSymlink(list[i])) {

get_dir_size(list[i]);

}

} catch(IOException e) {

Log.e("IOException", e.getMessage());

}

}

}

}

private static boolean isSymlink(File file) throws IOException {

File fileInCanonicalDir = null;

if (file.getParent() == null) {

fileInCanonicalDir = file;

} else {

File canonicalDir = file.getParentFile().getCanonicalFile();

fileInCanonicalDir = new File(canonicalDir, file.getName());

}

return !fileInCanonicalDir.getCanonicalFile().equals(fileInCanonicalDir.getAbsoluteFile());

}

private void search_file(String dir, String fileName, ArrayList<String> n) {

File root_dir = new File(dir);

String[] list = root_dir.list();

if(list != null && root_dir.canRead()) {

int len = list.length;

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

File check = new File(dir + "/" + list[i]);

String name = check.getName();

if(check.isFile() && name.toLowerCase().

contains(fileName.toLowerCase())) {

n.add(check.getPath());

}

else if(check.isDirectory()) {

if(name.toLowerCase().contains(fileName.toLowerCase()))

n.add(check.getPath());

else if(check.canRead() && !dir.equals("/"))

search_file(check.getAbsolutePath(), fileName, n);

}

}

}

}

}



Приложение Б. Класс DirectoryInfo.java

package com.nexes.manager;

import java.io.File;

import java.util.Date;

import android.os.Bundle;

import android.os.AsyncTask;

import android.os.StatFs;

import android.os.Environment;

import android.content.Intent;

import android.app.Activity;

import android.app.ProgressDialog;

import android.view.View.OnClickListener;

import android.view.View;

import android.widget.TextView;

import android.widget.Button;

public class DirectoryInfo extends Activity {

private static final int KB = 1024;

private static final int MG = KB * KB;

private static final int GB = MG * KB;

private String mPathName;

private TextView mNameLabel, mPathLabel, mDirLabel,

mFileLabel, mTimeLabel, mTotalLabel;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.info_layout);

Intent i = getIntent();

if(i != null) {

if(i.getAction() != null && i.getAction().equals(Intent.ACTION_VIEW)) {

mPathName = i.getData().getPath();

if(mPathName == null)

mPathName = "";

} else {

mPathName = i.getExtras().getString("PATH_NAME");

}

}

mNameLabel = (TextView)findViewById(R.id.name_label);

mPathLabel = (TextView)findViewById(R.id.path_label);

mDirLabel = (TextView)findViewById(R.id.dirs_label);

mFileLabel = (TextView)findViewById(R.id.files_label);

mTimeLabel = (TextView)findViewById(R.id.time_stamp);

mTotalLabel = (TextView)findViewById(R.id.total_size);

Button zip = (Button)findViewById(R.id.zip_button);

zip.setVisibility(Button.GONE);

Button back = (Button)findViewById(R.id.back_button);

back.setOnClickListener(new ButtonHandler());

new BackgroundWork().execute(mPathName);

}

private class BackgroundWork extends AsyncTask<String, Void, Long> {

private ProgressDialog dialog;

private String mDisplaySize;

private int mFileCount = 0;

private int mDirCount = 0;

protected void onPreExecute(){

dialog = ProgressDialog.show(DirectoryInfo.this, "", "Calculating information...", true, true);

}

protected Long doInBackground(String... vals) {

FileManager flmg = new FileManager();

File dir = new File(vals[0]);

long size = 0;

int len = 0;

File[] list = dir.listFiles();

if(list != null)

len = list.length;

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

if(list[i].isFile())

mFileCount++;

else if(list[i].isDirectory())

mDirCount++;

}

if(vals[0].equals("/")) {

StatFs fss = new StatFs(Environment.getRootDirectory().getPath());

size = fss.getAvailableBlocks() * (fss.getBlockSize() / KB);

mDisplaySize = (size > GB) ?

String.format("%.2f Gb ", (double)size / MG) :

String.format("%.2f Mb ", (double)size / KB);

}else if(vals[0].equals("/sdcard")) {

StatFs fs = new StatFs(Environment.getExternalStorageDirectory()

.getPath());

size = fs.getBlockCount() * (fs.getBlockSize() / KB);

mDisplaySize = (size > GB) ?

String.format("%.2f Gb ", (double)size / GB) :

String.format("%.2f Gb ", (double)size / MG);

} else {

size = flmg.getDirSize(vals[0]);

if (size > GB)

mDisplaySize = String.format("%.2f Gb ", (double)size / GB);

else if (size < GB && size > MG)

mDisplaySize = String.format("%.2f Mb ", (double)size / MG);

else if (size < MG && size > KB)

mDisplaySize = String.format("%.2f Kb ", (double)size/ KB);

else

mDisplaySize = String.format("%.2f bytes ", (double)size);

}

return size;

}

protected void onPostExecute(Long result) {

File dir = new File(mPathName);

mNameLabel.setText(dir.getName());

mPathLabel.setText(dir.getAbsolutePath());

mDirLabel.setText(mDirCount + " folders ");

mFileLabel.setText(mFileCount + " files ");

mTotalLabel.setText(mDisplaySize);

mTimeLabel.setText(new Date(dir.lastModified()) + " ");

dialog.cancel();

}

}

private class ButtonHandler implements OnClickListener {

@Override

public void onClick(View v) {

if(v.getId() == R.id.back_button)

finish();

}

}

}


в формате Microsoft Word (.doc / .docx)
Комментарии
Комментарии на этой странице отключены автором.

Похожие публикации