<
  • Главная
Статьи

Підключення до датчиків в Android

  1. Сенсорні можливості Android
  2. Таблиця 1. Апаратно-орієнтовані функції SDK Android
  3. Приклад роботи з датчиком
  4. Малюнок 1. Моніторинг прискорення і орієнтації
  5. Лістинг 1. IBMEyes.java
  6. застосування MediaRecorder
  7. Лістинг 2. Запис аудіофрагмента
  8. Android як вимірювальна платформа
  9. Малюнок 2. Блок-схема Android-орієнтованої системи датчиків
  10. висновок
  11. Ресурси для скачування

Спостерігаємо за навколишнім середовищем дистанційно

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

Яке додаток краще побудувати, щоб задіяти апаратні можливості пристрою на платформі Android? Підійде будь-який, в якому потрібні електронні очі і вуха. На думку спадає електронна няня, система безпеки або навіть сейсмограф. Хоча з метафізичної точки зору одночасно бути присутнім в двох місцях неможливо, Android може запропонувати деякі практичні способи подолання цього обмеження. В рамках цієї статті під Android-пристроєм розуміється не просто "мобільний телефон", а встановлений в певному місці пристрій з бездротовим з'єднанням з мережею, таким як EDGE або Wi-Fi. завантажте вихідний код прикладу додатки для цієї статті.

Сенсорні можливості Android

Один з приємних аспектів роботи з платформою Android полягає в можливості отримати доступ до деяких корисним компонентам самого пристрою. До сих пір розробників мобільних пристроїв розчаровувала неможливість доступу до їх внутрішнього обладнання. Хоча між вами і металом все ж залишається прошарок Java-середовища Android, команда розробників Android вивела багато можливостей апаратури на поверхню. А так як це платформа з відкритим вихідним кодом, можна засукати рукава і написати власний код для вирішення своїх завдань.

завантажте SDK Android, якщо ви цього ще не зробили. Рекомендуємо також вивчити вміст пакета android.hardware і стежити за прикладами цієї статті. пакет android.media package містить класи, які надають розробникам нові корисні функції.

Нижче описані деякі апаратно-орієнтовані функції, що містяться в SDK Android.

Таблиця 1. Апаратно-орієнтовані функції SDK Android

Функція Опис android.hardware.Camera Клас, що дозволяє додаткам взаємодіяти з відеокамерою в цілях фотозйомки, записи зображень з екрану попереднього перегляду або для зміни параметрів настройки. android.hardware.SensorManager Клас, що забезпечує доступ до внутрішніх датчикам платформи Android. Чи не кожен пристрій на платформі Android підтримує всі датчики з SensorManager, однак цікаво обміркувати такі можливості. (Короткий опис наявних датчиків приведено нижче.) Android.hardware.SensorListener Інтерфейс реалізований за допомогою класу, який використовується для введення значень датчиків у міру їх зміни в режимі реального часу. Додаток реалізує цей інтерфейс для моніторингу одного або декількох наявних апаратних датчиків. наприклад, код з цієї статті містить клас, який використовує цей інтерфейс для контролю орієнтації пристрою і показань вбудованого акселерометра. android.media.MediaRecorder Клас, використовуваний для запису медіафрагментов, який можна застосовувати для запису звуків в певному місці (наприклад, в дитячій кімнаті). Можна також аналізувати аудіофрагменти для контролю доступу в приміщення і в цілях безпеки. Наприклад, можна відкривати двері власним голосом в звичайний час свого приходу, замість того, щоб звертатися до консьєржа за ключем. android.FaceDetector Клас, який дозволяє розпізнавати обличчя людини по зберігається в пам'яті фотографії. Ніщо не посвідчує особу краще, ніж особа. Якщо використовувати його для блокування пристрою, вам більше не доведеться запам'ятовувати паролі - досить біометричних можливостей мобільного телефону. android.os. * Пакет, що містить кілька корисних класів для взаємодії з операційним середовищем, включаючи управління живленням, пошук файлів, обробник і класи для обміну повідомленнями. Як і багато інших портативні пристрої, телефони на базі Android можуть споживати досить багато електроенергії. Забезпечення "неспання" пристрою в потрібний момент, щоб проконтролювати потрібну подію, - важливий аспект проектування, заслуговує на особливу увагу. java.util.Date
java.util.Timer
java.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 демонструє додаток в дії.

Малюнок 1. Моніторинг прискорення і орієнтації
Спостерігаємо за навколишнім середовищем дистанційно   Платформа Android ідеально підходить для створення інноваційних програм з використанням апаратних датчиків, особливо Java-програмістами

Додаток створено в середовищі Eclipse з плагіном Android Developer Tools. (Більш детальну інформацію про розробку Android-додатків за допомогою Eclipse см. В розділі ресурси .) У лістингу 1 наведено код цього додатка.

Лістинг 1. IBMEyes.java

package com.msi.ibm.eyes; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.hardware.SensorManager; import android.hardware.SensorListener; public class IBMEyes extends Activity implements SensorListener {final String tag = "IBMEyes"; SensorManager sm = null; TextView xViewA = null; TextView yViewA = null; TextView zViewA = null; TextView xViewO = null; TextView yViewO = null; TextView zViewO = null; / ** Called when the activity is first created. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); // get reference to SensorManager sm = (SensorManager) getSystemService (SENSOR_SERVICE); setContentView (R.layout.main); xViewA = (TextView) findViewById (R.id.xbox); yViewA = (TextView) findViewById (R.id.ybox); zViewA = (TextView) findViewById (R.id.zbox); xViewO = (TextView) findViewById (R.id.xboxo); yViewO = (TextView) findViewById (R.id.yboxo); zViewO = (TextView) findViewById (R.id.zboxo); } Public void onSensorChanged (int sensor, float [] values) {synchronized (this) {Log.d (tag, "onSensorChanged:" + sensor + ", x:" + values ​​[0] + ", y:" + values [1] + ", z:" + values ​​[2]); if (sensor == SensorManager.SENSOR_ORIENTATION) {xViewO.setText ( "Orientation X:" + values ​​[0]); yViewO.setText ( "Orientation Y:" + values ​​[1]); zViewO.setText ( "Orientation Z:" + values ​​[2]); } If (sensor == SensorManager.SENSOR_ACCELEROMETER) {xViewA.setText ( "Accel X:" + values ​​[0]); yViewA.setText ( "Accel Y:" + values ​​[1]); zViewA.setText ( "Accel Z:" + values ​​[2]); }}} Public void onAccuracyChanged (int sensor, int accuracy) {Log.d (tag, "onAccuracyChanged:" + sensor + ", accuracy:" + accuracy); } @Override protected void onResume () {super.onResume (); // register this class as a listener for the orientation and accelerometer sensors sm.registerListener (this, SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop () {// unregister listener sm.unregisterListener (this); super.onStop (); }}

Це звичайна програма на основі дій, оскільки воно просто виводить на екран дані, одержувані від датчиків. Для ситуацій, коли пристрій повинен одночасно виконувати інші високопріоритетні дії, додаток краще було б реалізувати у формі сервісу.

Метод дії 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; File audiofile = null; private static final String TAG = "SoundRecordingDemo"; protected void startRecording () throws IOException {mrec.setAudioSource (MediaRecorder.AudioSource.MIC); mrec.setOutputFormat (MediaRecorder.OutputFormat.THREE_GPP); mrec.setAudioEncoder (MediaRecorder.AudioEncoder.AMR_NB); if (mSampleFile == null) {File sampleDir = Environment.getExternalStorageDirectory (); try {audiofile = File.createTempFile ( "ibm", ".3gp", sampleDir); } Catch (IOException e) {Log.e (TAG, "sdcard access error"); return; }} Mrec.setOutputFile (audiofile.getAbsolutePath ()); mrec.prepare (); mrec.start (); } Protected void stopRecording () {mrec.stop (); mrec.release (); processaudiofile (audiofile.getAbsolutePath ()); } Protected void processaudiofile () {ContentValues ​​values ​​= new ContentValues ​​(3); long current = System.currentTimeMillis (); values.put (MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName ()); values.put (MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000)); values.put (MediaStore.Audio.Media.MIME_TYPE, "audio / 3gpp"); values.put (MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath ()); ContentResolver contentResolver = getContentResolver (); Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Uri newUri = contentResolver.insert (base, values); sendBroadcast (new Intent (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); }

У методі 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 спрощено показано співвідношення між входами, логікою додатків і методами повідомлення або виходами.

Малюнок 2. Блок-схема Android-орієнтованої системи датчиків

Це дуже гнучка архітектура; логіку додатка можна розподіляти між локальним Android-пристроєм і серверними ресурсами, які можуть підключатися до більших баз даних і обчислювальних потужностей. Наприклад, аудіотрек, записаний на локальному Android-пристрої, можна відправити методом POST на Web-сервер, де дані зіставляються з базою даних зразків голосу. Ясно, що це тільки саме поверхневе знайомство з можливостями платформи. Сподіваюся, що ви зацікавилися і почнете копати глибше, щоб використовувати платформу Android не тільки для цілей мобільної телефонії.

висновок

З цієї статті ви отримали перше уявлення про роботу з датчиками Android. Наведені приклади додатків визначають орієнтацію і прискорення, а також взаємодіють із засобами звукозапису з використанням класу MediaRecorder. Android - гнучка, зручна платформа для створення систем взаємодії з реальним світом. Сфера впливу Android дуже швидко розширюється, і ця платформа освоює все нові сфери застосування. Не упускайте її з поля зору.

Ресурси для скачування

Схожі теми

  • оригінал статті (EN).
  • Сайт для розробників Android пропонує документацію, завантаження, блоги та багато іншого.
  • Спонсор Android: Open Handset Alliance - група з 47 компаній, що спеціалізуються на ІТ та мобільного зв'язку, які поставили перед собою мету прискорити впровадження інновацій в сфері мобільної телефонії і запропонувати споживачам ще більш широкі можливості, низькі ціни і кращу якість зв'язку.
  • завантажте SDK Android.
  • завантажте останню версію IDE Eclipse.
  • прочитайте книгу Unlocking Android , Щоб поглибити свої знання (EN).
  • Детальніше про Dalvik Virtual Machine .
  • відеокерівництво по влаштуванню Dalvik VM на YouTube.
  • Unlocking Android: A Developer's Guide - керівництво з практичними рекомендаціями щодо ОС Android і інструментам розробки (EN).
  • Інтерв'ю та дискусії розробників ПЗ в подкастах на developerWorks . (EN)
  • Слідкуйте за developerWorks по Твіттеру . (EN)
  • Використовуйте в своєму наступному проекті Open Source-розробки ознайомлювальне ПО IBM , Яке можна завантажити через Інтернет або замовити на DVD. (EN)
  • завантажте ознайомчі версії продуктів IBM або спробуйте онлайнові версії IBM SOA Sandbox і попрактикуйтесь в роботі з інструментами розробки додатків і продуктами проміжного рівня сімейств DB2®, Lotus®, Rational®, Tivoli® і WebSphere®. (EN)

Підпишіть мене на повідомлення до коментарів

Яке додаток краще побудувати, щоб задіяти апаратні можливості пристрою на платформі Android?
Це голос господаря, і потрібно розблокувати телефон?
Або це фраза "Сезам, відкрийся", яка відмикає потайні двері?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью