Освоїти сенсори Android: апаратні, програмні та багатовимірні

Автор: John Stephens
Дата Створення: 26 Січень 2021
Дата Оновлення: 5 Липня 2024
Anonim
Освоїти сенсори Android: апаратні, програмні та багатовимірні - Додатки
Освоїти сенсори Android: апаратні, програмні та багатовимірні - Додатки

Зміст


Сьогодні більшість сучасних Android-пристроїв оснащені купою датчиків.

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

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

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

Які сенсори Android можна використовувати?

Датчики Android можна розділити на такі категорії:


  • Екологічні датчики. Вони вимірюють умови навколишнього середовища, такі як температура повітря, тиск, вологість та рівень освітленості навколишнього середовища.

  • Датчики положення Ця категорія включає датчики, що вимірюють фізичне положення пристрою, наприклад датчики наближення та датчики геомагнітного поля.
    Датчики руху Ці датчики вимірюють рух пристрою і включають акселерометри, датчики сили тяжіння, гіроскопи та датчики вектора обертання.

Крім того, датчиками можуть бути:

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

Екологічні датчики: Вимірювання навколишнього світла

Датчик світла Android вимірює навколишнє світло в «люкс», тобто інтенсивність світла, сприйняту людським оком. Значення люкс, що повідомляється датчиком, може змінюватись у різних пристроях, тому якщо для вашої програми потрібні послідовні значення, то, можливо, вам доведеться маніпулювати необробленими даними, перш ніж використовувати їх у вашому додатку.


У цьому розділі ми створимо програму, яка отримує поточне значення люкс із датчика світла пристрою, відображає його в TextView, а потім оновлює TextView, коли нові дані стануть доступними.Потім ви можете використовувати цю інформацію в різних додатках, наприклад, ви можете створити програму факела, яка витягує інформацію з датчика світла, а потім автоматично регулює силу променя на основі поточного рівня освітлення.

Створіть новий проект Android з налаштуваннями на ваш вибір, і почнемо!

Відображення даних датчика

Я додам TextView, який в кінцевому підсумку відображатиме дані, які ми дістали з датчика світла. Цей TextView оновлюватиметься, коли з’являться нові дані, тому користувач завжди має доступ до найновішої інформації.

Відкрийте файл Activity_main.xml проекту та додайте наступне:

Далі нам потрібно створити рядок "light_sensor", на який вказується наш макет. Відкрийте файл strings.xml проекту та додайте наступне:

Датчик світла:% 1 $ .2f

"% 1 $ .2f" - це заповнювач, який вказує інформацію, яку ми хочемо відобразити, та спосіб її форматування:

  • %1. Ви можете вставити декілька заповнювачів в один і той же рядок ресурсу; "% 1" означає, що ми використовуємо один заповнювач.
  • $.2. Це визначає, як наша програма повинна форматувати кожне вхідне значення з плаваючою комою. Значення "$ .2" вказує на те, що значення слід округлювати до двох знаків після коми.
  • F. Відформатуйте значення у вигляді числа з плаваючою комою.

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

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

У нас відкритий файл strings.xml, давайте створимо рядок "no_sensor", який ми відобразимо, якщо датчик світла недоступний:

Датчик світла недоступний

Якщо ваша програма не може забезпечити корисну роботу користувачів без доступу до певного датчика, вам потрібно додати цю інформацію до свого Manifest. Наприклад, якщо вашому додатку потрібен доступ до датчика компаса, ви можете використовувати наступне:

Тепер ваш додаток можна завантажувати лише на пристрої, у яких є датчик компаса.

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

Спілкування з датчиком: SensorManager, SensorEvents та слухачами

Для зв'язку з датчиком світла пристрою потрібно виконати наступні дії:

1. Отримати примірник SensorManager

SensorManager надає всі методи, необхідні для отримання доступу до повного спектру датчиків пристрою.

Для початку створіть змінну, яка містить примірник SensorManager:

приватний SensorManager lightSensorManager;

Потім вам потрібно отримати екземпляр SensorManager, зателефонувавши до методу Context.getSystemService і передавши аргумент Context.SENSOR_SERVICE:

lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE);

2. Отримайте посилання на lightTextView

Далі нам потрібно створити змінну приватного члена, яка буде містити наші об’єкти TextView, і призначити її нашому TextView:

приватний TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. Перевірте, чи існує датчик на поточному пристрої

Ви можете отримати доступ до певного датчика, зателефонувавши методу getDefaultSensor (), а потім передавши йому відповідний датчик. Постійна типу для датчика світла - TYPE_LIGHT, тому нам потрібно використовувати наступне:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Якщо датчика не існує на цьому пристрої, то метод getDefaultSensor () поверне нульове значення, і ми відобразимо рядок "no_sensor":

String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }}

4. Зареєструйте слухачів сенсорів

Щоразу, коли сенсор отримує нові дані, Android генерує об’єкт SensorEvent. Цей об’єкт SensorEvent включає датчик, який генерував подію, часову позначку та нове значення даних.

Спочатку ми зосередимо увагу на датчиках світла та близькості, які повертають єдину частину даних. Однак деякі датчики надають багатовимірні масиви для кожного SensorEvent, включаючи датчик вектора обертання, який ми будемо вивчати в кінці цієї статті.

Щоб переконатися, що наша програма отримує повідомлення про ці об’єкти SensorEvent, нам потрібно зареєструвати слухача для цього конкретного події датчика, використовуючи registerListener SensorManager's registerListener ().

Метод registerListener () приймає такі аргументи:

  • Додаток або контекст діяльності
  • Тип датчика, який потрібно контролювати.
  • Швидкість, з якою датчик повинен надсилати нові дані. Більш висока швидкість забезпечить вашій програмі більше даних, але вона також використовуватиме більше системних ресурсів, особливо час роботи акумулятора. Щоб зберегти акумулятор пристрою, потрібно запитати мінімальний обсяг даних, який потрібна вашій програмі. Я буду використовувати SensorManager.SENSOR_DELAY_NORMAL, який надсилає нові дані раз на 200000 мікросекунд (0,2 секунди).

Оскільки прослуховування датчика розряджає акумулятор пристрою, ви ніколи не повинні реєструвати слухачів методом onCreate () у вашій програмі, оскільки це призведе до того, що датчики можуть продовжувати надсилати дані, навіть коли ваша програма знаходиться у фоновому режимі.

Натомість слід зареєструвати свої датчики в методі життєвого циклу програмиStart () програми:

@Override захищений недійсним onStart () {super.onStart (); // Якщо датчик доступний на поточному пристрої ... // if (lightSensor! = Null) {//…. Тоді починають слухати // lightSensorManager.registerListener (це, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Встановіть зворотні виклики SensorEventListener

SensorEventListener - це інтерфейс, який отримує сповіщення від SensorManager
кожного разу, коли доступні нові дані або точність сенсора змінюється.

Перший крок - це зміна підпису нашого класу для реалізації інтерфейсу SensorEventListener:

загальнодоступний клас MainActivity розширює додаток AppCompatActivity реалізує SensorEventListener {

Потім нам потрібно реалізувати такі методи зворотного виклику:

onSensorChanged ()

Цей метод викликається у відповідь на кожен новий SensorEvent.

Дані датчика часто можуть швидко змінюватися, тому ваша програма може регулярно викликати метод onSensorChanged (). Щоб забезпечити безперебійну роботу програми, вам слід виконати якомога менше роботи всередині методу onSensorChanged ().

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Щоб зробити //}

onAccuracyChanged ()

Якщо точність сенсора покращиться або знизиться, Android викличе метод onAccuracyChanged () і передасть йому об’єкт Sensor, що містить нове значення точності, наприклад SENSOR_STATUS_UNRELIABLE або SENSOR_STATUS_ACCURACY_HIGH.

Датчик світла не повідомляє про зміни точності, тому я залишаю порожній зворотний дзвінок onAccuracyChanged ():

@Override public void onAccuracyChanged (Датчик датчика, int i) {// To // //}

6. Отримайте значення датчика

Щоразу, коли у нас є нове значення, нам потрібно викликати метод onSensorChanged () та отримати рядок "light_sensor". Потім ми можемо замінити текст заповнення рядка (% 1 $ .2f) і відобразити оновлений рядок як частину нашого TextView:

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Поточне значення датчика // float currentValue = sensorEvent.values; // Витягніть рядок “light_sensor”, вставте нове значення та покажіть його користувачеві // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Скасуйте своїх слухачів

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

Щоб перестати слухати сенсорні події, коли ваша програма перебуває у фоновому режимі, додайте метод реєстрації до реєстрації onStop () проекту undegisterListener ():

@Override захищено відмінністю onStop () {super.onStop (); lightSensorManager.unregisterListener (це); }

Зауважте, що ви не повинні скасовувати реєстрацію своїх слухачів у програмі onPause (), як у програмах Android 7.0 та новіших версіях можуть працювати в розділеному екрані та режимі зображення в картинці, де вони перебувають у призупиненому стані, але залишаються видимими на екрані.

Використання датчиків світла Android: Завершений код

Після виконання всіх вищезазначених кроків, MainActivity вашого проекту має виглядати приблизно так:

імпортувати android.support.v7.app.AppCompatActivity; імпортувати android.os.Bundle; імпорт android.content.Context; імпорт android.hardware.Sensor; імпорт android.hardware.SensorEvent; імпортувати android.hardware.SensorEventListener; імпортувати android.hardware.SensorManager; імпортувати android.widget.TextView; загальнодоступний клас MainActivity розширює AppCompatActivity // Реалізуємо інтерфейс SensorEventListener // реалізує SensorEventListener {// Створення змінних // private Sensor lightSensor; приватний SensorManager lightSensorManager; приватний TextView lightTextView; @Override захищений недійсним onCreate (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Отримати примірник SensorManager // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Перевірте наявність датчика світла // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Якщо датчика світла не існує, відобразиться помилка // String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @ Oververide захищена пустота onStart () {super.onStart (); // Якщо датчик доступний на поточному пристрої ... // if (lightSensor! = Null) {//…. Тоді зареєструйте слухача // lightSensorManager.registerListener (це, lightSensor, // Вкажіть, як часто ви хочете отримувати нові дані // SensorManager.SENSOR_DELAY_NORMAL); }} @ Override захищений недійсним onStop () {super.onStop (); // Скасувати реєстрацію свого слухача // lightSensorManager.unregisterListener (це); } @ Oververide public void onSensorChanged (SensorEvent sensorEvent) {// Поточне значення датчика // float currentValue = sensorEvent.values; // Витягніть рядок "light_sensor", вставте нове значення та оновіть TextView // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @ Oververide // Якщо точність датчика змінюється… .// публічна недійсність на AcccuracyChanged (Sensor sensor, int i) {// TO DO //}}

Перевірте завершений додаток для сенсорів Android

Щоб перевірити цю програму на фізичному смартфоні або планшеті Android:

  • Встановіть проект на свій пристрій (вибравши «Запустити> Запустити» на панелі інструментів Android Studio).
  • Хоча він відрізняється між пристроями, датчик світла часто розташований у правому верхньому куті екрана. Щоб маніпулювати рівнем освітлення, перемістіть пристрій ближче до, а потім далі від джерела світла. Можна також спробувати прикрити пристрій рукою, щоб заблокувати світло. Значення «Датчика світла» повинно збільшуватися та зменшуватися, залежно від кількості доступного світла.

Якщо ви використовуєте віртуальний пристрій Android (AVD), то емулятор має набір елементів управління віртуальними датчиками, які можна використовувати для імітації різних подій датчика. Ви отримуєте доступ до цих елементів віртуального датчика через вікно «Розширені елементи керування" емулятора:

  • Встановіть програму на свій AVD.
  • Поряд із AVD ви побачите смужку кнопок. Знайдіть три пунктирну кнопку «Більше» (де курсор розміщений на наступному скріншоті) та натисніть на неї. Це запустить вікно "Розширені елементи керування".

  • У меню зліва виберіть "Віртуальні датчики".
  • Перейдіть на вкладку «Додаткові датчики». Ця вкладка містить різні слайдери, які можна використовувати для імітації різних подій та датчиків навколишнього середовища.

  • Знайдіть повзунок «Світло (люкс)» і перетягніть його вліво та вправо, щоб змінити імітований рівень освітлення. Ваша програма повинна відображати ці змінні значення в режимі реального часу.

Ви можете завантажити завершений проект з GitHub.

Вимірювання відстані за допомогою датчиків близькості Android

Тепер ми побачили, як отримати інформацію з екологічного датчика, давайте подивимось, як ви застосуєте ці знання до положення датчик

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

Створення інтерфейсу користувача

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

Далі відкрийте файл strings.xml та створіть рядок "blizin__senzor". Знову ж таки, цей рядок повинен містити заповнювач, який згодом буде заповнений даними, витягнутими з датчика близькості:

Датчик наближення Датчик близькості:% 1 $ .2f Датчик близькості недоступний

Отримання даних від датчика близькості

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

  • Створіть екземпляр SensorManager, який цього разу я буду називати "близькостіSensorManager".
  • Отримати екземпляр "близькостіSensorManager".
  • Створіть посилання на "proximityTextView".
  • Викличте метод getDefaultSensor () і передайте йому датчик TYPE_PROXIMITY.
  • Зареєструйте та скасуйте реєстрацію слухачів для датчика близькості.

Зробивши ці налаштування, слід закінчити таке:

імпортувати android.support.v7.app.AppCompatActivity; імпортувати android.os.Bundle; імпорт android.content.Context; імпорт android.hardware.Sensor; імпорт android.hardware.SensorEvent; імпортувати android.hardware.SensorManager; імпортувати android.hardware.SensorEventListener; імпортувати android.widget.TextView; загальнодоступний клас MainActivity розширює AppCompatActivity // Реалізуємо інтерфейс SensorEventListener // реалізує SensorEventListener {// Створення змінних // приватна близькість SensorSensor; приватна близькість SensorManagerSensorManager; приватна близькість TextViewTextView; @Override захищений недійсним onCreate (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); setContentView (R.layout.activity_main); proximityTextView = (TextView) findViewById (R.id.proximityTextView); // Отримати примірник SensorManager // proximitySensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Перевірте наявність датчика близькості // proximitySensor = proximitySensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Якщо датчика близькості не існує, відобразіть помилку // String sensor_error = getResources (). GetString (R.string.no_sensor); якщо (proximitySensor == null) {proximityTextView.setText (sensor_error); }} @ Oververide захищена пустота onStart () {super.onStart (); // Якщо датчик доступний на поточному пристрої ... // if (proximitySensor! = Null) {//…. Тоді зареєструйте слухача // proximitySensorManager.registerListener (це, близькостьSensor, // Вкажіть, як часто ви хочете отримувати нові дані // SensorManager.SENSOR_DELAY_NORMAL); }} @ Override захищений недійсним onStop () {super.onStop (); // Скасувати реєстрацію свого слухача для збереження системних ресурсів // proximitySensorManager.unregisterListener (це); } @ Oververide public void onSensorChanged (SensorEvent sensorEvent) {// Поточне значення датчика // float currentValue = sensorEvent.values; // Витягніть рядок "proximity_sensor", вставіть нове значення та оновіть TextView // proximityTextView.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @ Oververide // Якщо точність датчика змінюється… .// публічна недійсність на AccracyracyChanged (Sensor sensor, int i) {//...TO DO //}}

Тестування: Наскільки близько користувач до свого пристрою?

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

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

Щоб перевірити цю програму на емуляторі:

  • Встановіть свою програму на AVD.
  • Знайдіть трикутну кнопку «Більше» та натисніть на неї, що запустить вікно «Розширені елементи керування».
  • У лівому меню вікна виберіть "Віртуальні датчики".
  • Перейдіть на вкладку «Додаткові датчики».
  • Знайдіть повзунок «Близькість» та перетягніть його вліво та вправо, щоб імітувати об'єкт, що рухається ближче до пристрою, а потім далі. Значення "Датчик близькості" повинні змінюватися під час маніпуляції повзунком.

Ви можете завантажити завершений проект з GitHub.

Датчики руху: обробка багатовимірних масивів

До цього моменту ми зосереджувались на датчиках, що надають один елемент даних, але є деякі датчики, які надають багатовимірні масиви для кожного SensorEvent. Ці багатовимірні датчики включають датчики руху, про які ми зупинимося в цьому останньому розділі.

Датчики руху можуть допомогти вам:

  • Надайте альтернативний метод введення користувачем. Наприклад, якщо ви розробляєте мобільну гру, користувач може переміщати свого персонажа по екрану, нахиляючи свій пристрій.
  • Діяльність користувачів. Якщо ви створили додаток для відстеження активності, датчики руху допоможуть вам визначити, чи користувач подорожує в машині, займається бігом чи сидить за своїм робочим столом.
  • Більш точно визначити орієнтацію.Можна витягнути координати з датчиків руху пристрою, а потім перекласти їх на основі земної системи координат, щоб отримати найбільш точне уявлення про поточну орієнтацію пристрою.

У цьому заключному розділі ми будемо використовувати датчик вектора обертання (TYPE_ROTATION_VECTOR). На відміну від датчиків світла та близькості, це датчик програмного забезпечення, який збирає дані з датчиків акселерометра, магнітометра та гіроскопа пристрою. Хоча робота з цим датчиком часто вимагає виконання математичних перетворень та перетворень, він також може надавати вам ряд високоточних відомостей про пристрій.

Ми створимо додаток, який використовує датчик вектора обертання для вимірювання:

  • Крок. Це нахил пристрою зверху вниз.
  • Рулон. Це нахил пристрою зліва направо.

Відображення даних про крок та прокат у режимі реального часу

Оскільки ми вимірюємо дві показники, нам потрібно створити два TextView і два відповідні рядкові ресурси:

Відкрийте файл strings.xml та додайте наступне:

Датчики руху Датчик нахилу:% 1 $ .2f Датчик кочення:% 1 $ .2f Датчик руху не доступний

Використання датчика вектора обертання у вашій програмі

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

1. Використовуйте TYPE_ROTATION_VECTOR

Оскільки ми працюємо з датчиком вектора обертання, нам потрібно викликати метод getDefaultSensor () і передати його константі TYPE_ROTATION_VECTOR:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. Перекладіть дані датчика

На відміну від попередніх датчиків світла та близькості, датчики руху повертають багатовимірні масиви значень датчика для кожного SensorEvent. Ці значення відформатовані за допомогою стандартної системи координат "X, Y, Z", яка обчислюється відносно пристрою, коли він утримується в його "природній" орієнтації за замовчуванням.

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

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

По-перше, система координат пристрою - це стандартна 3-осі система координат X, Y, Z, де кожна точка на кожній з трьох осей представлена ​​3D-вектором. Це означає, що нам потрібно створити масив з 9 знаків з плаваючою ознакою:

float rotatationMatrix = новий поплавок;

Потім ми можемо передати цей масив методу getRotationMatrix ():

SensorManager.getRotationMatrixFromVector (обертанняMatrix, вектори); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

Наступним кроком є ​​використання методу SensorManager.remapCoordinateSystem () для перенабору даних сенсорів, виходячи з поточної орієнтації пристрою.

Метод SensorManager.remapCoordinateSystem () приймає такі аргументи:

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

Ось код, який я буду використовувати у своєму додатку:

поплавок налаштованийRotationMatrix = новий поплавок; SensorManager.remapCoordinateSystem (обертанняMatrix, worldAxisX, worldAxisZ, коригуванняRotationMatrix);

Нарешті, ми зателефонуємо на SensorManager.getOrientation і скажемо йому скористатися скоригованою матрицею:

SensorManager.getOrientation (коригуванняРотаціяМатриця, орієнтація);

3. Оновіть рядки заповнювача

Оскільки у нас є два набори даних (крок і рулон), нам потрібно отримати два окремі рядки заповнювачів, заповнити їх правильними значеннями, а потім оновити відповідні TextView:

pitchTextView.setText (getResources (). getString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll));

Відображення декількох даних датчика: Завершений код

Після виконання вищезазначених кроків ваша MainActivity повинна виглядати приблизно так:

імпорт android.app.Activity; імпортувати android.os.Bundle; імпорт android.hardware.Sensor; імпорт android.hardware.SensorEvent; імпортувати android.hardware.SensorEventListener; імпортувати android.hardware.SensorManager; імпортувати android.widget.TextView; публічний клас MainActivity розширює Діяльність реалізує SensorEventListener {приватний SensorManager motionSensorManager; приватний датчик руху сенсор; приватний TextView pitchTextView; приватний ролик TextView rollTextView; приватний статичний кінцевий int SENSOR_DELAY = 500 * 1000; приватний статичний кінцевий int FROM_RADS_TO_DEGS = -57; @Override захищений недійсним onCreate (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); спробуйте {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (це, motionSensor, SENSOR_DELAY); } улов (виняток е) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @ Перевернути публічну недійсність onAccuracyChanged (Сенсор датчика, int точність) {// To // }} приватне оновлення пустоти (float vectors) {// Обчислити матрицю обертання // float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector (обертанняMatrix, вектори); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Відновлюємо матрицю на основі поточної орієнтації діяльності // float prilagođenRotationMatrix = новий поплавок; SensorManager.remapCoordinateSystem (обертанняMatrix, worldAxisX, worldAxisZ, коригуванняRotationMatrix); // Обчислити орієнтацію пристроїв // орієнтація поплавця = новий поплавок; // Поставити масив значень поплавця методу getOrientation () // SensorManager.getOrientation (коригуванняRotationMatrix, орієнтація); плаваючий крок = орієнтація * FROM_RADS_TO_DEGS; float roll = орієнтація * FROM_RADS_TO_DEGS; // Оновіть TextViews значеннями висоти та нахилу // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Ви можете завантажити завершений проект з GitHub.

Тестування нашого остаточного додатка для сенсорів Android

Щоб перевірити цей векторний додаток сенсорного додатка для Android на фізичному смартфоні або планшеті Android:

  • Встановіть програму на свій пристрій.
  • Розмістіть ваш смартфон або планшет на рівній поверхні. Зауважте, що датчики руху надзвичайно чутливі, тому не здається, що пристрій, здавалося б, нерухоме, повідомляє про коливання значень висоти та нахилу.
  • Щоб перевірити крок, підніміть нижню частину пристрою так, щоб він нахилявся від вас. Значення висоти має різко змінитися.
  • Щоб перевірити рулон, спробуйте підняти ліву частину свого пристрою, так що він нахиляється вліво - слідкуйте за цим значенням рулону!

Якщо ви тестуєте свій проект на емуляторі:

  • Встановіть програму на свій AVD.
  • Виберіть "Більше", що запускає вікно "Розширені елементи керування".
  • У меню зліва виберіть "Віртуальні датчики".
  • Переконайтесь, що вибрано вкладку «Акселерометр». На цій вкладці містяться елементи керування, які можуть імітувати зміни положення та орієнтації пристрою.
  • Спробуйте експериментувати з різними повзунками (Rotate: Z-Rot, X-Rot, Y-Rot; і Перемістіться: X, Y і Z) та різними кнопками "Rotation Device" (Обертання пристрою), щоб побачити, як вони впливають на "Датчик нахилу вашої програми". "Та" Датчик нахилу ".

Підведенню

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

Ви бачили якісь програми для Android, які використовують датчики цікавими чи унікальними способами? Повідомте нас у коментарях нижче!

На прес-конференції в Нью-Делі компанія Huawei запустила в Індії свій новий смарт-годинник Huawei Watch GT.Huawei Watch GT виглядає як звичайний годинник, триває до двох тижнів за один заряд і зменшує...

Оновлення, 29 жовтня 2019 р. (14:39 ET): Huawei надіслав наступне твердження до у відповідь на повідомлення FCC:За 30 років бізнесу компанія Huawei ніколи не мала серйозних інцидентів, пов'язаних ...

Нові Статті