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

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

android

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

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

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

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

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

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

Android.hardware.SensorManager містить кілька констант, які характеризують різні аспекти системи датчиків Android, у тому числі:

Тип датчика Орієнтація, акселерометр, світло, магнітне поле, близькість, температура і т.д.Частота вимірювань Максимальна, для ігор, звичайна, для інтерфейсу користувача. Коли програма запитує конкретне значення частоти відліків, з погляду сенсорної підсистемице лише рекомендація. Жодної гарантії, що вимірювання будуть проводитися із зазначеною частотою, немає.Точність Висока, низька, середня, ненадійні дані.

Центром сенсорних додатків служить інтерфейс SensorListener. Він включає два необхідні методи:

  • Метод onSensorChanged(int sensor,float values[]) викликається щоразу, коли змінюється значення датчика. Цей метод викликається лише для датчиків, контрольованих цією програмою (докладніше про це нижче). До аргументів методу входить ціле, яке вказує, що значення датчика змінилося, і масив значень з плаваючою комою, що відображають власне значення датчика. Деякі датчики видають лише одне значення даних, тоді як інші надають три значення з плаваючою комою. Датчики орієнтації та акселерометр дають по три значення даних кожен.
  • Метод onAccuracyChanged(int sensor,int accuracy) викликається за зміни точності показань датчика. Аргументами служать два цілих числа: одне вказує датчик, інше відповідає новому значенню точності цього датчика.

Для взаємодії з датчиком програма повинна зареєструватися на прийом дій, пов'язаних з одним або кількома датчиками. Реєстрація здійснюється за допомогою методу registerListener класу SensorManager. Приклад коду цієї статті демонструє, як додаток реєструється і скасовує реєстрацію за допомогою SensorListener .

Пам'ятайте, що не кожен Android підтримує той чи інший датчик, вказаний у SDK. Якщо на конкретному пристрої немає датчика, ваш додаток повинен обробляти цю ситуацію акуратно.

Приклад роботи з датчиком

Цей приклад програми просто стежить за змінами значень датчиків орієнтації таакселерометра (вихідний код наведено у розділі Завантаження). При зміні значень датчиків вони відображаються на екрані у віджеті TextView. Малюнок 1 демонструє додаток у дії.

Малюнок 1. Моніторинг прискорення та орієнтації

датчиків

підключення

Програма створена в середовищі Eclipse з плагіном Android Developer Tools. (Докладнішу інформацію про створення Android-застосунків за допомогою Eclipse див. у розділі Ресурси.) У лістингу 1 наведено код цієї програми.

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

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

Метод дії onCreate отримує посилання на SensorManager, де розташовані всі пов'язані з датчиками функції. Крім того, метод onCreate створює посилання на шість віджетів TextView, в які будуть виводитися результати вимірювань.

Метод onResume() , використовуючи посилання на SensorManager , реєструється на прийом оновлень даних датчика за допомогою registerListener :

  • Перший параметр є екземпляр класу, що реалізує інтерфейс SensorListener .
  • Другий параметр – це бітова маска бажаних датчиків. У цьому випадку програма запитує дані з SENSOR_ORIENTATION і SENSOR_ACCELEROMETER .
  • Третій параметр вказує системі, як швидко повинні оновлюватися значення датчиків для цієї програми.

Коли робота програми припиняється, потрібно скасувати реєстрацію приймача, щоб не отримувати оновлення значень датчика. Це робиться за допомогою методу unregisterListener класу SensorManager.Єдиним параметром є екземпляр SensorListener.

При викликі обох методів registerListener та unregisterListener програма використовує ключове слово this . Зверніть увагу на ключове слово implements у визначенні класу, яке декларує, що цей клас реалізує інтерфейс SensorListener. Ось чому в registerListener і unregisterListener передається це.

SensorListener повинен реалізувати два методи: onSensorChange і onAccuracyChanged . Наш приклад програми не дбає про точність датчиків, а лише вводить поточні значення X, Y та Z цих датчиків. Метод наобслуговуваннізмінюється, по суті, нічого не робить; він просто додає запис до журналу під час кожного виклику.

Здається, що метод onSensorChanged викликається постійно, оскільки акселерометр і датчик орієнтації передають дані швидко. Щоб визначити, який датчик передає дані, ми дивимося перший параметр. Коли передавальний датчик виявлено, відповідні елементи інтерфейсу користувача оновлюються даними, що містяться в масиві значень з плаваючою комою, прийнятому в якості другого аргументу методу. Хоча приклад просто відображає ці значення, в більш складних додатках вони можуть аналізуватися, порівнюватися з попередніми значеннями або використовуватися в алгоритмі розпізнавання образів для визначення того, що робить користувач (або що відбувається в зовнішньому середовищі).

Застосування MediaRecorder

У лістингу 2 наведено код для запису звуку на Android. Цей код не включає елементи інтерфейсу програми (повний вихідний код див. у розділі завантажень).

Лістинг 2. Запис аудіофрагменту

У методі startRecording створюється та ініціалізується екземпляр MediaRecorder.

  • Як джерело данихвибирається мікрофон (MIC).
  • Вихідний формат встановлюється в 3GPP (файли *.3gp) – медіаформат, орієнтований на мобільні пристрої.
  • Кодер налаштований на AMR_NB – аудіоформат із частотою дискретизації 8 кГц. NB означає вузьку смугу частот. Різні формати даних та наявні кодери розглядаються в документації SDK.

Аудіофайл зберігається не у внутрішній пам'яті, а на окремій карті. External.getExternalStorageDirectory() повертає імена карти пам'яті та тимчасового файлу, створеного в цьому каталозі. Потім цей файл зв'язується з екземпляром MediaRecorder, звертаючись до методу setOutputFile. Аудіодані будуть зберігатися у цьому файлі.

Виклик методу prepare завершує ініціалізацію MediaRecorder. Коли потрібно розпочати процес запису, викликається метод start. Запис у файл на картці пам'яті ведеться доти, доки не буде викликаний метод stop . Цей метод звільняє ресурси, виділені екземпляру MediaRecorder.

Коли аудіофрагмент записаний, можна виконати кілька дій:

У прикладі коду метод processaudiofile додає аудіозапис в медіатеку. Щоб повідомити вбудовану програму про наявність нової інформації, використовується Intent .

І останнє зауваження про цей фрагмент коду: відразу після створення він не записуватиме аудіо. Ви побачите створений файл, але не почуєте звуку. Потрібно додати дозвіл у файл AndroidManifest.xml:

Тепер ви дещо знаєте про взаємодію з датчиками Android та запис аудіо. У наступному розділі наводиться ширший огляд архітектури додатків, пов'язаних із збиранням даних та системами передачі повідомлень.

Android як вимірювальна платформа

Платформа Android має широкі можливості для вимірювання параметрів навколишнього середовища. При такомурізноманітті вхідних параметрів та датчиків у поєднанні з потужними обчислювальними та мережевими функціями Android стає привабливою платформою для створення систем взаємодії з реальним світом. На малюнку 2 спрощено показано співвідношення між входами, логікою додатків та методами сповіщення або виходами.

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

датчиків

android

Висновок

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

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

  • цей контент у PDF
  • Вихідний код прикладу Eyes (os-android-sensorEyes.zip 28 КБ)
  • Вихідний код прикладу IBMAudio (os-android-sensorIBMAudio.zip 33 КБ)

Схожі теми

Коментарі