Главная » Разработка для Android » РАЗРАБОТКА ПРИЛОЖЕНИЙ ДЛЯ РАЗЛИЧНЫХ УСТРОЙСТВ – ЧАСТЬ 5

0

РАБОТА С МУЛЬТИМЕДИА

Мобильные устройства все больше и больше используются в качестве муль- тимедийных устройств. Многие устройства Android имеют встроенные камеры, микрофоны и громкоговорители, позволяя воспроизводить и записывать мультимедийные данные в различных форматах. Инструментарий Android SDK обеспечивает всестороннюю поддержку мультимедийных данных, позволяя разработчикам встраивать звуковые и визуальные элементы (изображения и видео) в приложения. Соответствующие интерфейсы API — это часть пакета android.media.

ВНИМАНИЕ! ___________________________________________________________

Эмулятор Android не позволяет записывать аудио или видео. Тестирование воз- мож- ностей записи аудио и видео должно осуществляться на реальном устройстве Android Кроме того, возможности записи отдельно взятого устройства могут зависеть от ис­пользуемых аппаратных и программных компонент. Например, в устройствах Android, которые не являются телефонами, могут отсутствовать микрофоны и, что встречается гораздо чаще, камеры.

Воспроизведение и запись аудио

Инструментарий Android SDK предоставляет механизмы для воспроизведения и записи аудио в различных форматах. Аудиофайлы могут представлять собой ресурсы, локальные файлы или объекты типа URI, ссылающиеся на совместно используемые или сетевые ресурсы. Класс MediaPlayer (android.media.MediaPlayer) может быть использован для воспроизведения аудио, а класс MediaRecorder (android.media.MediaRecorder) — для записи аудио. Для записи аудио приложению требуется разрешение android.permission.RECORD_AUDIO.

Воспроизведение и запись видео

Вы можете использовать элемент пользовательского интерфейса VideoView для воспроизведения видеофайлов на экране. Элемент MediaController позволяет добавить к элементу VideoView основные элементы управления воспроизведением, например кнопки «Воспроизведение», «Пауза» и «Стоп» (рис. 21.3).

Как и в случае с записью аудио, вы можете использовать класс MediaRecorder для записи видео при помощи встроенной камеры. Приложения, обращающиеся к аппаратному обеспечению камеры, должны иметь разрешение android.permission.camera, а те из них, которые записывают аудио при помощи класса        MediaRecorder, должны           иметь  разрешение

android.permission.REC0RD_AUDIO, указанные в файле манифеста Android. Таким образом, чтобы записать видео с использованием микрофона и камеры, в файл манифеста Android должны быть добавлены оба разрешения.

Рис. 21.3. Элемент пользовательского интерфейса VideoView с элементом MediaController

РАБОТА С ДВУХМЕРНОЙ И ТРЕХМЕРНОЙ ГРАФИКОЙ

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

Использование графических библиотек платформы Android

Инструментарий Android SDK поставляется вместе с пакетом android.graphics, который содержит ряд удобных классов для рисования на экране (рис. 21.4). К возможностям пакета graphics инструментария Android SDK можно отнести инструменты для работы с растровыми изображениями

Рис.21.5. Изображение, созданное при помощи интерфейса OpenGL ES на платформе Android

Рис. 21.4. Простое двухмерное

изображение, созданное с использованием графической библиотеки платформы Android

Использование графического интерфейса OpenGL ES

Для создания более сложной графики платформа Android использует популярный графический интерфейс OpenGL ES (версия 1.0), а также обеспечивает ограниченную поддержку интерфейса OpenGL ES версии 1.1. Приложения могут использовать поддержку интерфейса OpenGL ES на платформе Android для рисования, анимации, освещения, создания теней и текстуриро- вания графических объектов в трехмерном пространстве (рис. 21.5).

ПЕРСОНАЛИЗАЦИЯ УСТРОЙСТВ ANDROID

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

Установка рингтона

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

(android.permission.WRITE_SETTINGS). Вы также можете запустить приложение, позволяющее выбрать рингтон, используя интент ACTION_RINGTONE_PICKER.

Установка обоев

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

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

Дополнительную информацию по обоям можно найти в документации инструментария Android SDK, связанной с пакетом android.service.wallpaper.

Создание «живых» обоев

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

«Живые» обои похожи на службы платформы Android. В результате их работы вы получаете поверхность, которую может отображать хост-процесс. Вы можете создавать «живые» обои любой сложности, однако необходимо принимать во внимание скорость реакции устройства на действия пользователя и ресурс батареи. Вот несколько примеров «живых» обоев:

•            трехмерная анимированная сцена, на которой рисуются абстрактные фигуры;

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

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

•             обои, которые изменяются в зависимости от поры года, погоды и времени дня.

КСТАТИ

Дополнительную информацию по созданию «живых» обоев можно найти в статье, т священной «живым» обоям, на сайте с документацией по платформе Android (bit. ly/bngiaP), а также можно взглянуть на пример приложения Cube Live Wallpaper, вво­дящего в состав инструментария Android SDK.

ХРАНЕНИЕ И ПРЕДОСТАВЛЕНИЕ ОБЩЕГО ДОСТУПА К ДАННЫМ

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

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

•            Приложения могут хранить данные на удаленном сервере приложения.

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

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

•             Приложения могут хранить структурированные данные в собственных базах данных SQLite.

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

•             приложения могут предоставлять общий доступ к своим внутренним данным, выступая в роли контент-провайдеров.

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

Работа с файлами и каталогами

Каждое Android-приложение имеет свои собственные каталоги и файлы. Вы можете использовать стандартный Java-пакет java.io, который обеспечивает поддержку операций ввода/вывода, для управления файлами и каталогами. Для хранения файлов Android-приложений используется стандартная иерархия каталогов в файловой системе Android. В файловой системе Android данные Android-приложения хранятся в следующем каталоге верхнего уровня:

/data/data/<Нaзвание пакета>/

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

•             openFileInput() — открывает файл приложения, находящийся в подкаталоге /files, для чтения.

•             openFileOutput() — открывает файл приложения, находящийся в подкаталоге /files, для записи.

•             deleteFile () — удаляет файл приложения из подкаталоге /files, используя имя этого файла.

•             fileList() — позволяет получить список всех файлов, находящихся в подкаталоге /files.

•             getFilesDi^) — позволяет получить объект типа File для подкаталога /files.

•             getCacheDir() — позволяет получить объект типа File для подкаталога /cache.

•             getDir() — создает или получает объект типа File для подкаталога с указанным именем.

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Вы можете просмотреть содержимое файловой системы Android (эмулятора или под­ключенного устройства), используя панель File Explorer (Проводник) перспективы DDMS.

Хранение структурированных данных в СУБД SQLIte

Android-приложения могут взаимодействовать с собственной локальной базой данных под управлением СУБД SQLite. Реляционные базы данных SQLite легковесны и файлоориентированны — идеальный вариант для мобильных устройств. Инструментарий Android SDK включает ряд полезных классов для работы с базами данных SQLite. Классы, обеспечивающие поддержку баз данных SQLite на платформе Android, доступны в пакете android.database.sqlite. В частности, вы найдете вспомогательные классы для выполнения следующих операций:

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

•             построение правильных SQL-запросов;

•             обработка результатов выполнения запросов с использованием объектов типа

Cursor;

•             выполнение транзакций в базе данных;

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

ЗНАЕТЕ ЛИ ВЫ ЧТО… __________________________________________________

Инструментарий Android SDK имеет встроенную поддержку СУБД SQLite. Тем не

менее в пакете android.database вы также найдете общие классы для работы с базами данных.

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

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

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

ИСПОЛЬЗОВАНИЕ КОНТЕНТ-ПРОВАЙДЕРОВ

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

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

РАССМОТРЕНИЕ НЕКОТОРЫХ НАИБОЛЕЕ ЧАСТО ИСПОЛЬЗУЕМЫХ КОНТЕНТ-ПРОВАЙДЕРОВ

Контент-провайдеры, доступные на платформе Android, можно найти в пакете android.provider. Вот несколько наиболее полезных контент-провайдеров:

• MediaStore — применяется для доступа к мультимедийным данным (аудио, видео и изображениям) на телефоне и на внешних устройствах хранения информации;

• CallLog — применяется для доступа к информации о набранных, входящих и пропущенных телефонных вызовах;

•             Browser — применяется для доступа к журналу посещенных пользователем веб­страниц и к веб-сайтам, добавленным в закладки;

•             Contacts — используется для доступа к базе данных контактов пользователя;

•             UserDictionary — словарь определенных пользователем слов для ис­пользования в функции предикативного ввода текста.

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Вы можете связать данные из курсора базы данных или курсора контент-провайдера непосредственно с элементами пользовательского интерфейса View, например с эле­ментами ListView. Для этого используйте один из элементов Adapter, например элемент ArrayAdapter или CursorAdapter, и элемент пользовательского интер­фейса View, унаследованный от класса AdapterView, например элемент ListView или Spinner.

ПРЕДОСТАВЛЕНИЕ ДАННЫХ В КАЧЕСТВЕ КОНТЕНТ-ПРОВАЙДЕРА

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

ОРГАНИЗАЦИЯ КОНТЕНТА С ИСПОЛЬЗОВАНИЕМ «ЖИВЫХ» ПАПОК

«Живая» папка – по особый тип объекта, при нажатии на который отображаются данные из приложения, выступающего в роли контент-провайдера. Например, музыкальное приложение может предоставлять пользователю возможность создания «живых» папок для определенных списков воспроизведения музыкальных композиций, которые могут быть помещены на домашний экран (для создания «живой» папки нажмите и удерживайте на любой точке домашнего экрана и в появившемся меню выберите команду Folders (Папки)). Чтобы создать «живую» папку, приложение должно создать класс Activity, который будет отвечать на интент-действие ACTION_CREATE_LIVE_FOLDER, и должно иметь соответствующий объект типа ContentProvider, предоставляющий содержимое для «живой» папки. Дополнительную информацию можно найти в документации по пакету android.provider.LiveFolders.

Интеграция с механизмом глобального поиска

Операционная система Android позволяет приложениям делать свои данные доступными для поиска на уровне системы. Для этого необходимо соответствующим образом настроить приложение и предоставить пользовательские классы Activity, принимающие различные команды, которые требуются для обработки поисковых запросов и результатов поиска. Кроме того, приложения могут предоставлять варианты окончания поискового запроса, которые будут отображаться при вводе пользователем критериев поиска в соответствующее поле ввода (поле ввода Quick Search Box (Окно быстрого поиска)).

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

КСТАТИ _______________________________________________________________

Информацию о том, как встраивать функциональность глобального поиска в Android- приложения, можно найти в документации по классу SearchManager (android.app.SearchManager), а также можно взглянуть на пример приложения Searchable Dictionary, входящего в состав инструментария Android SDK.

ВЗАИМОДЕЙСТВИЕ С НИЖЕЛЕЖАЩИМ АППАРАТНЫМ ОБЕСПЕЧЕНИЕМ УСТРОЙСТВА

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

•             чтение исходных данных с датчиков (например, с магнитною датчика и датчика ориентации);

•             доступ к модулям Wi-Fi и Bluetooth;

•             мониторинг использования батареи устройства и управление параметрами питания.

ВНИМАНИЕ! __________________________________________________________

Не все датчики и аппаратное обеспечение доступны на каждом устройстве Android.

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

Чтение исходных данных с датчика

Вот несколько датчиков устройства, поддерживаемых инструментарием Android SDK: Акселерометр — измеряет ускорение в трех плоскостях.

•             Датчик освещенности — измеряет освещенность (этот показатель полезно использовать для определения необходимости включения вспышки камеры).

•            Датчик магнитного поля — измеряет магнетизм в трех плоскостях.

•            Датчик ориентации — определяет ориентацию устройства.

•            Температурный датчик — измеряет температуру.

•             Датчик расстояния — измеряет расстояние от устройства до некоторой точки в пространстве.

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Эмулятор Android не имеет встроенной поддержки имитации датчиков устройства, однако компания Openintents предоставляет удобный эмулятор датчиков (www.openintents.org/en/node/23). Этот инструмент имитирует акселерометр, ком­пасный датчик и датчик ориентации, а также температурный датчик, и передает дан­ные в эмулятор. Вы также можете протестировать функциональность, относящуюся к датчикам, на целевом устройстве.

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

getSystemService() .

Работа с модулем Wi-Fi

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

WifiManager при помощи метода getSystemService() .

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

ВНИМАНИЕ! __________________________________________________________

В эмуляторе Android отсутствует поддержка модуля Wi-Fi, поэтому вы должны выпол­нять все тестирование интерфейса API для работы с сетью Wi-Fi на реальном устрой­стве.

Работа с модулем Bluetooth

Инструментарий Android SDK содержит классы для работы с модулем Bluetooth, которые доступны в пакете android.bluetooth. В этом пакете вы найдете классы для поиска устройств с включенным модулем Bluetooth и получения списка связанных устройств, а также классы для осуществления передачи данных.

Управление параметрами питания и временем работы батареи

Большинство мобильных устройств в основном работают от батареи питания. Чтобы контролировать заряд батареи, приложение должно иметь разрешение BATTERY_STATS, зарегистрироваться для получения интента Intent.ACTION_BATTERY_CHANGED типа Broadcastlntent, а также реализовать класс BroadcastReceiver для получения информации о батарее и выпол -нении любых необходимых действий. Вот некоторые сведения о батарее и параметрах питания, которые может контролировать ваше приложение:

•             наличие в данном устройстве батарее;

•             исправность батареи, статус (состояние зарядки), напряжение и температура;

•            уровень заряда батареи (в процентах) и соответствующий значок;

•             подключено ли устройство к сети переменного тока или получает питание через

шину USB.

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

ИТОГИ

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

ВОПРОСЫ И ОТВЕТЫ

Вопрос: Какие мультимедийные форматы поддерживаются платформой Android?

Ответ: Различные устройства Android поддерживают разные форматы. Сама платформа поддерживает ряд базовых форматов, однако конкретные устройства при необходимости также могут расширять этот список. Полный список поддерживаемых форматов можно найти в документации по платформе Android на странице http://devetoper.android.com/guide/appendlx/medla- formats.html.

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

Ответ: Рассмотрение деталей реализации возможностей, обсуждаемых в этом часе, выходит за рамки данной книги. Тем не менее вопросам профессиональной разработки приложений на платформе Android посвящена наша другая книга Android Wireless Application Development. Вы также можете найти множество примеров из инструментария Android SDK на вебсайте, посвященном разработке на платформе Android, по адресу https//developer.android.com.

ПРАКТИКУМ Контрольные вопросы

1.                                Верно ли это? Для обращения к контент-провайдерам Android- приложение всегда должно указывать необходимые разрешения в файле манифеста Android.

2.                                 Какие мультимедийные возможности доступны на платформе Android?

A.                               Возможность воспроизводить аудио.

B.                                Возможность воспроизводить видео.

C.                               Возможность записывать аудио.

D.                               Возможность записывать видео.

E.                                Все вышеперечисленные.

3.                                Верно ли это? Инструментарий Android SDK позволяет обращаться к световому индикатору на устройстве Android.

4.                                 Верно ли это? В этом часе рассматриваются все дополнительные воз­можности инструментария Android SDK, которые не были рассмотрены ранее в этой книге.

Ответы

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

2.                                 E. Пакет android.media включает поддержку возможностей воспроизведения и записи аудио и видео в различных форматах. Различные устрой’ ства Android имеют разное аппаратное обеспечение, поэтому вы должны проверять конкретные целевые устройства, чтобы убедиться, что они поддерживают мультимедийные возможности, необходимые вашему приложению.

3.                                Верно. Вы можете использовать класс Notification Manager для обращения к светодиодному индикатору на устройстве Android.

4.                 Неверно. Инструментарий Android SDK имеет множество других воз­

можностей и нюансов. Кроме того, платформа Android стремительно обновляется и развивается. Различные ресурсы, блоги, статьи и руководства разработчиков можно найти на сайте http://developer.android.com. Также в нашем блоге, доступном по адресу http://andraidbook.blogspot.com, вы можете найти разнообразные советы, трюки, руководства и ссылки на другие ресурсы.

Литература: Дэрси JI., Android за 24 часа. Программирование приложений под операционную систему Google/ ДэрсиЛ., КондерШ. — М.: Рид Групп, 2011. — 464 с. — (Профессиональные компьютерные книги). ISBN 978-5-4252-0318-2

По теме:

  • Комментарии