Овладете сензорите на 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“, който ще покажем, ако сензорът за светлина не е наличен:

Няма наличен сензор за светлина

Ако вашето приложение не може да осигури добро потребителско изживяване, без да имате достъп до определен сензор, тогава трябва да добавите тази информация към вашия Манифест. Например, ако приложението ви изисква достъп до сензор за компас, тогава можете да използвате следното:

Сега приложението ви може да бъде изтеглено само на устройства, които имат сензор за компас.

Въпреки че това може да ограничи аудиторията ви, е много по-малко вредно от това да разрешите на някой да изтегли приложението ви, когато е в състояние гарантирана да имат лошо преживяване поради конфигурацията на сензорите на устройството им.

Комуникация със сензор: 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); ако (lightSensor == null) {lightTextView.setText (sensor_error); }}

4. Регистрирайте слушателите на сензора си

Всеки път, когато датчикът има нови данни, Android генерира обект SensorEvent. Този обект SensorEvent включва сензора, генерирал събитието, времева марка и новата стойност на данните.

Първоначално ще се съсредоточим върху светлините и сензорите за близост, които връщат едно цяло количество данни. Въпреки това, някои сензори предоставят многоизмерни масиви за всеки SensorEvent, включително сензора за ротационен вектор, който ще проучим в края на тази статия.

За да гарантираме, че приложението ни е известено за тези обекти на SensorEvent, трябва да регистрираме слушател за това конкретно събитие на сензора, използвайки registerListener на SensorManager ().

Методът registerListener () взема следните аргументи:

  • Приложение или контекст на дейност
  • Типът сензор, който искате да наблюдавате.
  • Скоростта, с която сензорът трябва да изпраща нови данни. По-високата скорост ще осигури на приложението ви повече данни, но също така ще използва повече системни ресурси, особено живот на батерията. За да запазите батерията на устройството, трябва да поискате минималния обем данни, който вашето приложение изисква. Ще използвам SensorManager.SENSOR_DELAY_NORMAL, който изпраща нови данни веднъж на всеки 200 000 микросекунди (0,2 секунди).

Тъй като слушането на датчик изтощава батерията на устройството, никога не трябва да регистрирате слушатели в метода onCreate () на приложението си, тъй като това ще доведе до продължаване на изпращането на данни, дори когато приложението ви е на заден план.

Вместо това трябва да регистрирате сензорите си в метода на жизнения цикъл на приложението onStart ():

@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) {// За да направите //}}

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. Отменете регистрацията на слушателите си

Сензорите могат да генерират големи количества данни за малък период от време, така че за да запазите ресурсите на устройството, ще трябва да регистрирате слушателите си, когато те вече не са необходими.

За да спрете да слушате сензорни събития, когато приложението ви е на заден план, добавете undegisterListener () към метода на жизнения цикъл на onStop () на вашия проект:

@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 {// Създайте вашите променливи // частен Sensor lightSensor; частен SensorManager lightSensorManager; частен TextView lightTextView; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); 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); ако (lightSensor == null) {lightTextView.setText (sensor_error); }} @ Oververide защитен празнота onStart () {super.onStart (); // Ако сензорът е наличен на текущото устройство ... // if (lightSensor! = Null) {//…. Тогава регистрирайте слушател // lightSensorManager.registerListener (това, lightSensor, // Укажете колко често искате да получавате нови данни // SensorManager.SENSOR_DELAY_NORMAL); }} @ Oververide защитен празнота 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)); } @Override // Ако точността на сензора се промени… .// обществена невалидност на AccracyracyChanged (Сензор за сензор, int i) {// TO DO //}}

Тествайте завършеното си приложение за сензор за Android

За да тествате това приложение на физически смартфон или таблет с Android:

  • Инсталирайте проекта на вашето устройство (като изберете „Run> Run“ от лентата с инструменти на Android Studio).
  • Въпреки че варира между устройствата, светлинният сензор често се намира в горната дясна част на екрана. За да манипулирате нивата на светлината, преместете устройството си по-близо и след това по-далеч от източник на светлина. Освен това можете да опитате да покриете устройството с ръка, за да блокирате светлината. Стойността „Сензор за светлина“ трябва да се увеличава и намалява, в зависимост от количеството налична светлина.

Ако използвате виртуално устройство за Android (AVD), емулаторът има набор от контроли за виртуални сензори, които можете да използвате за симулиране на различни сензорни събития. Имате достъп до тези контроли на виртуалните сензори чрез прозореца „Разширени контроли“ на емулатора:

  • Инсталирайте приложението на вашия AVD.
  • Покрай AVD ще видите лента с бутони. Намерете триточков бутон „Още“ (където курсорът е разположен на следната екранна снимка) и го кликнете. Това стартира прозореца „Разширени контроли“.

  • В менюто отляво изберете „Виртуални сензори“.
  • Изберете раздела „Допълнителни сензори“. Този раздел съдържа различни плъзгачи, които можете да използвате за симулиране на различни събития на датчици за позиция и околна среда.

  • Намерете плъзгача „Light (lux)“ и го плъзнете наляво и надясно, за да промените симулираните нива на светлина. Вашето приложение трябва да показва тези променящи се стойности в реално време.

Можете да изтеглите завършения проект от GitHub.

Измерване на разстояние със сензори за близост на Android

Сега видяхме как да извличаме информация от сензор за околната среда, нека да разгледаме как ще приложите това знание към позиция сензор.

В този раздел ще използваме сензора за близост на устройството, за да наблюдаваме разстоянието между вашия смартфон или таблет и други обекти. Ако приложението ви има всякакъв вид гласова функционалност, тогава сензорът за близост може да ви помогне да определите кога смартфонът се държи до ухото на потребителя, например, когато те водят телефонен разговор. След това можете да използвате тази информация, за да деактивирате сензорни събития, така че потребителят да не затвори случайно или да задейства други нежелани събития в средата на разговора.

Създаване на потребителски интерфейс

Ще покажа данните за близост на екрана, така че можете да гледате как се актуализират в реално време. За да улесним нещата, нека използваме отново голяма част от оформлението от предишното ни приложение:

След това отворете файла strings.xml и създайте низ „proximity_sensor“. За пореден път, този низ трябва да съдържа запазено място, което в крайна сметка ще бъде попълнено от данни, извлечени от сензора за близост:

Сензор за близост Сензор за близост:% 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 {// Създайте вашите променливи // private private Sensor близостSensor; частна близост до SensorManagerSensorManager; частен TextView близостTextView; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); 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 (близостSensor! = Null) {//…. Тогава регистрирайте слушател // proximitySensorManager.registerListener (това, близостSensor, // Укажете колко често искате да получавате нови данни // SensorManager.SENSOR_DELAY_NORMAL); }} @ Oververide защитен празнота 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 (Сензор на сензора, int i) {//...TO DO //}}

Тестване: Колко близо е потребителят до неговото устройство?

За да поставите това приложение на тест на физически смартфон или таблет с Android, инсталирайте приложението на устройството си и след това експериментирайте, като преместите ръката си към екрана и след това го преместите отново. Стойността „Сензор за близост“ трябва да записва вашите движения.

Само имайте предвид, че сензорите за близост могат да варират в различните устройства. Някои устройства могат да показват само две стойности на близост - едната да показва „Близо“ и една да показва „Далеч“ - така че не се изненадвайте, ако не видите много разнообразие на физическото си устройство с Android.

За да тествате това приложение на емулатор:

  • Инсталирайте приложението си на AVD.
  • Намерете триточков бутон „Още“ и го кликнете, което стартира прозореца „Разширени контроли“.
  • В лявото меню на прозореца изберете „Виртуални сензори“.
  • Изберете раздела „Допълнителни сензори“.
  • Намерете плъзгача „Близост“ и го плъзнете наляво и надясно, за да подражавате на обект, който се движи по-близо до устройството, и след това по-далеч. Стойностите „Сензор за близост“ трябва да се променят, докато манипулирате плъзгача.

Можете да изтеглите завършения проект от GitHub.

Сензори за движение: Обработка на многоизмерни масиви

До този момент се съсредоточихме върху сензори, които предоставят един елемент от данни, но има някои сензори, които предоставят многоизмерни масиви за всеки SensorEvent. Тези многоизмерни сензори включват сензори за движение, върху които ще се съсредоточим в този последен раздел.

Сензорите за движение могат да ви помогнат:

  • Предоставете алтернативен метод за въвеждане на потребител. Например, ако разработвате мобилна игра, тогава потребителят може да премести героя си по екрана, като наклони устройството си.
  • Дейност на потребителите. Ако сте създали приложение за проследяване на активността, сензорите за движение могат да ви помогнат да прецените дали потребителят пътува в кола, бяга или седи на бюрото си.
  • По-точно определете ориентацията.Възможно е да извлечете координати от датчиците за движение на устройството и след това да ги преведете въз основа на земната координатна система, за да получите най-точния поглед върху текущата ориентация на устройството.

В този последен раздел ще използваме сензор за вектор на въртене (TYPE_ROTATION_VECTOR). За разлика от сензорите за светлина и близост, това е софтуерен сензор, който събира данни от сензорите за акселерометър, магнитометър и жироскоп на устройството. Въпреки че работата с този сензор често изисква да извършите математически преобразувания и преобразувания, той също може да ви предостави набор от високо точна информация за устройството.

Ще създаваме приложение, което използва сензора за завъртане на вектора за измерване:

  • Pitch. Това е наклона отгоре надолу на устройството.
  • Roll. Това е наклона отляво надясно на устройството.

Показване на данни за стъпка и ролка в реално време

Тъй като измерваме две показатели, трябва да създадем два TextView и два съответни низови ресурса:

Отворете файла strings.xml и добавете следното:

MotionSensors Pitch Sensor:% 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 стойности:

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 и ще му кажем да използва приспособената RootationMatrix:

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 {private SensorManager motionSensorManager; частен сензор за движение сензор; частен TextView pitchTextView; частен TextView rollTextView; частен статичен краен int SENSOR_DELAY = 500 * 1000; частен статичен краен int FROM_RADS_TO_DEGS = -57; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); 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); }} @ Oververide public void onAccuracyChanged (Сензор на сензора, int точност) {// To do //} @ Oververide public void onSensorChanged (SensorEvent event) {if (event.sensor == motionSensor) {update (event.values); }} частна актуализация на void (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); // Изчисляване на ориентацията на устройствата // float ориентация = new float; // Доставяне на масив от плаващи стойности към метода 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; и Move: X, Y и Z) и различните бутони „Rotation Rotation“, за да видите как те влияят върху „Roll Sensor“ на вашето приложение Стойности “и„ Pitch Sensor “.

Обобщавайки

В тази статия видяхме как да извличаме данни от трите основни категории сензори за Android: околна среда, позиция и движение и как да наблюдаваме тези данни в реално време.

Виждали ли сте приложения за Android, които използват сензори по интересни или уникални начини? Уведомете ни в коментарите по-долу!

Актуализация, 27 май 2019 г. (8:00 ч. ET): Xiaomi вече има вариант с 16-гигабайтово пространство за съхранение. Най-голямата ни грижа с обикновения осем гигабайт модел беше ограниченото количество хра...

Новият Android Q код предполага, че предстоящата версия на O ще даде на операторите повече контрол върху IM-заключващите телефони.Хипотетично операторите биха могли да блокират втората IM карта в теле...

Очарователни Публикации