Меню Документы
Вход в систему
Облако тэгов
| Подключение к датчикам в Android |
|
|
|
| Функция | Описание |
|---|---|
android.hardware.Camera | Класс, позволяющий приложениям взаимодействовать с видеокамерой в целях фотосъемки, записи изображений с экрана предварительного просмотра или для изменения параметров настройки. |
android.hardware.SensorManager | Класс,
обеспечивающий доступ к внутренним датчикам платформы Android. Не
каждое устройство на платформе Android поддерживает все датчики из SensorManager, однако интересно обдумать такие возможности. (Краткое описание имеющихся датчиков приведено ниже.) |
android.hardware.SensorListener | Интерфейс реализован с помощью класса, который используется для ввода значений датчиков по мере их изменения в режиме реального времени. Приложение реализует этот интерфейс для мониторинга одного или нескольких имеющихся аппаратных датчиков. Например, код из этой статьи содержит класс, который использует этот интерфейс для контроля ориентации устройства и показаний встроенного акселерометра. |
android.media.MediaRecorder | Класс, используемый для записи медиафрагментов, который можно применять для записи звуков в определенном месте (например, в детской комнате). Можно также анализировать аудиофрагменты для контроля доступа в помещение и в целях безопасности. Например, можно открывать дверь собственным голосом в обычное время своего прихода, вместо того, чтобы обращаться к консьержу за ключом. |
android.FaceDetector | Класс, который позволяет распознавать лицо человека по хранящейся в памяти фотографии. Ничто не удостоверяет личность лучше, чем лицо. Если использовать его для блокировки устройства, вам больше не придется запоминать пароли – достаточно биометрических возможностей мобильного телефона. |
| android.os.* | Пакет, содержащий несколько полезных классов для взаимодействия с операционной средой, включая управление питанием, поиск файлов, обработчик и классы для обмена сообщениями. Как и многие другие портативные устройства, телефоны на базе Android могут потреблять достаточно много электроэнергии. Обеспечение "бодрствования" устройства в нужный момент, чтобы проконтролировать нужное событие, - важный аспект проектирования, заслуживающий особого внимания. |
java.util.Datejava.util.Timerjava.util.TimerTask | При измерении событий реального мира часто имеют значение дата и время. Например, класс java.util.Date позволяет получить метку времени, когда происходит какое-либо событие или возникает определенное состояние. java.util.Timer и java.util.TimerTask
можно использовать соответственно для выполнения периодических действий
по расписанию или разового действия в определенный момент времени. |
Android.hardware.SensorManager содержит несколько констант, которые характеризуют различные аспекты системы датчиков Android, в том числе:
- Тип датчика
- Ориентация, акселерометр, свет, магнитное поле, близость, температура и т.д.
- Частота измерений
- Максимальная, для игр, обычная, для пользовательского интерфейса. Когда приложение запрашивает конкретное значение частоты отсчетов, с точки зрения сенсорной подсистемы это лишь рекомендация. Никакой гарантии, что измерения будут производиться с указанной частотой, нет.
- Точность
- Высокая, низкая, средняя, ненадежные данные.
Центром сенсорных приложений служит интерфейс SensorListener. Он включает в себя два необходимых метода:
- Метод
onSensorChanged(int sensor,float values[])вызывается всякий раз, когда изменяется значение датчика. Этот метод вызывается только для датчиков, контролируемых данным приложением (подробнее об этом ниже). В число аргументов метода входит целое, которое указывает, что значение датчика изменилось, и массив значений с плавающей запятой, отражающих собственно значение датчика. Некоторые датчики выдают только одно значение данных, тогда как другие предоставляют три значения с плавающей запятой. Датчики ориентации и акселерометр дают по три значения данных каждый. - Метод
onAccuracyChanged(int sensor,int accuracy)вызывается при изменении точности показаний датчика. Аргументами служат два целых числа: одно указывает датчик, а другое соответствует новому значению точности этого датчика.
Для взаимодействия с датчиком приложение должно зарегистрироваться
на прием действий, связанных с одним или несколькими датчиками.
Регистрация осуществляется с помощью метода registerListener класса SensorManager. Пример кода для этой статьи демонстрирует, как приложение регистрируется и отменяет регистрацию с помощью SensorListener.
Помните, что не каждое устройство Android поддерживает тот или иной датчик, указанный в SDK. Если на конкретном устройстве тот или иной датчик отсутствует, ваше приложение должно обрабатывать эту ситуацию аккуратно.
Пример работы с датчиком
Этот пример приложения просто следит за изменениями значений
датчиков ориентации и акселерометра (исходный код приведен в разделе Загрузки). При изменении значений датчиков они отображаются на экране в виджете TextView. Рисунок 1 демонстрирует приложение в действии.
Приложение создано в среде Eclipse с плагином Android Developer Tools. (Более подробную информацию о разработке Android-приложений с помощью Eclipse см. в разделе Ресурсы.) В листинге 1 приведен код этого приложения.
Листинг 1. IBMEyes.java
package com.msi.ibm.eyes; |
Это обычное приложение на основе действий, поскольку оно просто выводит на экран данные, получаемые от датчиков. Для ситуаций, когда устройство должно одновременно выполнять другие высокоприоритетные действия, приложение лучше было бы реализовать в форме сервиса.
Метод действия onCreate получает ссылку на SensorManager, где расположены все связанные с датчиками функции. Кроме того, метод onCreate создает ссылки на шесть виджетов TextView, в которые будут выводиться результаты измерений.
Метод onResume(), используя ссылку на SensorManager, регистрируется на прием обновлений данных датчика посредством метода registerListener:
- Первый параметр представляет собой экземпляр класса, реализующий интерфейс
SensorListener. - Второй параметр - это битовая маска желаемых датчиков. В данном случае приложение запрашивает данные из
SENSOR_ORIENTATIONиSENSOR_ACCELEROMETER. - Третий параметр указывает системе, как быстро должны обновляться значения датчиков для данного приложения.
Когда
работа приложения приостанавливается, нужно отменить регистрацию
приемника, чтобы больше не получать обновления значений датчика. Это
делается с помощью метода unregisterListener класса SensorManager. Единственным параметром является экземпляр SensorListener.
При вызове обоих методов registerListener и unregisterListener приложение использует ключевое слово this. Обратите внимание на ключевое слово implements в определении класса, которое декларирует, что этот класс реализует интерфейс SensorListener. Вот почему в registerListener и unregisterListener передается this.
SensorListener должен реализовать два метода: onSensorChange и onAccuracyChanged. Наш пример приложения не заботится о точности датчиков, а лишь вводит текущие значения X, Y и Z этих датчиков. Метод onAccuracyChanged, по существу, ничего не делает; он просто добавляет запись в журнал при каждом вызове.
Кажется, что метод onSensorChanged вызывается
постоянно, так как акселерометр и датчик ориентации передают данные
быстро. Чтобы определить, какой датчик передает данные, мы смотрим на
первый параметр. Когда передающий датчик выявлен, соответствующие
элементы пользовательского интерфейса обновляются данными,
содержащимися в массиве значений с плавающей запятой, принятом в
качестве второго аргумента метода. Хотя пример просто отображает эти
значения, в более сложных приложениях они могут анализироваться,
сравниваться с предыдущими значениями или использоваться в некоем
алгоритме распознавания образов для определения того, что делает
пользователь (или что происходит во внешней среде).
Теперь, когда мы рассмотрели подсистему датчиков, в следующем разделе приведем пример кода, который записывает звук на телефон Android. Этот пример работает на устройстве для разработчиков Dev1.
Применение MediaRecorder
Пакет Android.media содержит классы для взаимодействия с мультимедийной подсистемой. Класс android.media.MediaRecorder используется для записи медиафрагментов, включая аудио и видео. MediaRecorder
действует как конечный автомат. Вы задаете различные параметры, такие
как устройство-источник и формат. После установки запись может
выполняться как угодно долго, пока не будет остановлена.
В листинге 2 приведен код для записи звука на устройство Android. Этот код не включает элементы пользовательского интерфейса приложения (полный исходный код см. в разделе загрузок).
Листинг 2. Запись аудиофрагмента
MediaRecorder mrec ; |
В методе startRecording создается и инициализируется экземпляр MediaRecorder.
- В качестве источника данных выбирается микрофон (
MIC). - Выходной формат устанавливается в 3GPP (файлы *.3gp) - медиаформат, ориентированный на мобильные устройства.
- Кодер настроен на
AMR_NB- аудиоформат с частотой дискретизации 8 кГц. NB означает узкую полосу частот. Различные форматы данных и имеющиеся кодеры рассматриваются в документации SDK.
Аудиофайл хранится не во внутренней памяти, а на отдельной карте. External.getExternalStorageDirectory() возвращает имена карты памяти и временного файла, созданного в этом каталоге. Затем этот файл связывается с экземпляром MediaRecorder, обращаясь к методу setOutputFile. Аудиоданные будут храниться в этом файле.
Вызов метода prepare завершает инициализацию MediaRecorder. Когда нужно начать процесс записи, вызывается метод start. Запись в файл на карте памяти ведется до тех пор, пока не будет вызван метод stop. Этот метод освобождает ресурсы, выделенные экземпляру MediaRecorder.
Когда аудиофрагмент записан, можно выполнить несколько действий:
- Добавить аудиозапись в медиатеку на устройстве.
- Выполнить некоторые шаги по распознаванию звука:
- Не плач ли это ребенка?
- Это голос хозяина, и нужно разблокировать телефон?
- Или это фраза "Сезам, откройся", которая отпирает потайную дверь?
- Автоматически загрузить звуковой файл в сетевую папку для обработки.
В примере кода метод processaudiofile добавляет аудиозапись в медиатеку. Для уведомления встроенного приложения о том, что доступна новая информация, используется Intent.
И последнее замечание об этом фрагменте кода: сразу после создания он не будет записывать аудио. Вы увидите созданный файл, но не услышите звука. Нужно добавить разрешение в файл AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> |
Теперь вы кое-что знаете о взаимодействии с датчиками Android и записи аудио. В следующем разделе приводится более широкий обзор архитектуры приложений, связанных со сбором данных и системами передачи сообщений.
Android как измерительная платформа
Платформа Android располагает широкими возможностями по измерению параметров окружающей среды. При таком многообразии входных параметров и датчиков в сочетании с мощными вычислительными и сетевыми функциями Android становится привлекательной платформой для создания систем взаимодействия с реальным миром. На рисунке 2 упрощенно показано соотношение между входами, логикой приложений и методами уведомления или выходами.
Это очень гибкая архитектура; логику приложения можно распределять
между локальным Android-устройством и серверными ресурсами, которые
могут подключаться к более крупным базам данных и вычислительным
мощностям. Например, аудиотрек, записанный на локальном
Android-устройстве, можно отправить методом POST на
Web-сервер, где данные сопоставляются с базой данных образцов голоса.
Ясно, что это только самое поверхностное знакомство с возможностями
платформы. Надеюсь, что вы заинтересовались и начнете копать глубже,
чтобы использовать платформу Android не только для целей мобильной
телефонии.
Заключение
Из этой статьи вы получили первое представление о работе с датчиками
Android. Приведенные примеры приложений определяют ориентацию и
ускорение, а также взаимодействуют со средствами звукозаписи с
использованием класса MediaRecorder. Android - гибкая,
удобная платформа для создания систем взаимодействия с реальным миром.
Сфера влияния Android очень быстро расширяется, и эта платформа
осваивает все новые области применения. Не упускайте ее из вида.
Загрузка
| Описание | Имя | Размер |
|---|---|---|
| Исходный код примера Eyes | os-android-sensorEyes.zip | 28 КБ |
| Исходный код примера IBMAudio | os-android-sensorIBMAudio.zip | 33 КБ |
Ресурсы
Научиться
- Оригинал статьи (EN).
-
"Разработка приложений для Android с помощью Eclipse."
-
Сайт для разработчиков Android предлагает документацию, загрузки, блоги и многое другое.
- Спонсор Android: Open Handset Alliance
- группа из 47 компаний, специализирующихся на ИТ и мобильной связи,
которые поставили перед собой цель ускорить внедрение инноваций в сфере
мобильной телефонии и предложить потребителям еще более широкие
возможности, низкие цены и лучшее качество связи.
-
Прочтите книгу Unlocking Android, чтобы углубить свои знания (EN).
-
Подробнее о Dalvik Virtual Machine.
-
Видеоруководства по устройству Dalvik VM на YouTube.
-
Unlocking Android: A Developer's Guide — руководство с практическими рекомендациями по ОС Android и инструментам разработки (EN).
-
Интервью и дискуссии разработчиков ПО в подкастах на developerWorks.(EN)
-
Чтобы оставаться в курсе новостей, посещайте раздел технических мероприятий и Web-трансляций на developerWorks.(EN)
- Следите за developerWorks по Твиттеру.(EN)
-
Следите за предстоящими конференциями, выставками, Web-трансляциями и другими мероприятиями во всем мире, которые могут заинтересовать разработчиков открытого ПО IBM.(EN)
-
Посетите раздел открытого ПО developerWorks,
содержащий богатую справочную информацию, инструменты и новости по
проектам, которые помогают в разработке технологий с открытым исходным
кодом и их использовании с продуктами IBM.(EN)
-
Узнавайте о технологиях IBM и возможностях продуктов IBM и Open Source и учитесь работать с ними с помощью бесплатных демонстраций по требованию на developerWorks.(EN)
Получить продукты и технологии
-
Загрузите SDK Android.
-
Загрузите последнюю версию IDE Eclipse.
-
Используйте в своем следующем проекте Open Source-разработки ознакомительное ПО IBM, которое можно загрузить через Интернет или заказать на DVD.(EN)
- Загрузите ознакомительные версии продуктов IBM или попробуйте онлайновые версии IBM SOA Sandbox
и попрактикуйтесь в работе с инструментами разработки приложений и
продуктами промежуточного уровня семейств DB2®, Lotus®, Rational®,
Tivoli® и WebSphere®.(EN)
Обсудить
- Примите участие в обсуждении материала на форуме developerWorks.
-
Принимайте участие в блогах developerWorks и в жизни сообщества developerWorks.(EN)
Об авторе
Когда Фрэнк Эйблсон (Frank Ableson) закончил карьеру баскетболиста в команде своего колледжа, не заключив многолетнего контракта с «Лос-Анджедес Лейкерс», он занялся разработкой компьютерных программ. Он любит решать сложные задачи, особенно из области связи и интерфейсов с аппаратурой. Свободное время Фрэнк проводит со своей женой Никки и детьми. С ним можно связаться по адресу: frank@cfgsolutions.com.

