Мастер Андроид сензори: хардвер, софтвер и вишедимензионално

Аутор: John Stephens
Датум Стварања: 26 Јануар 2021
Ажурирати Датум: 5 Јули 2024
Anonim
How to master reset Gear S3 with hardware keys - restore original factory settings
Видео: How to master reset Gear S3 with hardware keys - restore original factory settings

Садржај


Данас је већина модерних Андроид уређаја опремљена гомилом сензора.

Можете да користите ове информације на много различитих начина - било да прати ниво светлости како би апликација аутоматски подесила своју осветљеност или шему боја; омогућавање кориснику да комуницира с вашом мобилном игром користећи гесте попут нагињања свог уређаја; или помоћу сензора близине за аутоматско онемогућавање догађаја додира кад год корисник држи уређај за ухо.

У овом чланку направићемо три апликације које из различитих података о хардверу и софтверу проналазе податке о светлости, близини и кретању. Такође ћемо пратити ове Андроид сензоре у реалном времену, тако да ваша апликација увек има приступ најновијим информацијама.

На крају овог чланка сазнаћете како извући један део података са Андроид сензора и како руковати сензорима који дају њихове податке у облику вишедимензионалног низа.

Које Андроид сензоре могу да користим?

Андроид сензори се могу поделити у следеће категорије:


  • Еколошки сензори. Они мере услове животне средине, као што су температура ваздуха, притисак, влага и ниво светлости у околини.

  • Сензори положаја Ова категорија укључује сензоре који мере физички положај уређаја, попут сензора близине и сензора геомагнетног поља.
    Сензори кретања. Ови сензори мере кретање уређаја и укључују убрзаче, гравитационе сензоре, жироскопе и сензоре вектора ротације.

Поред тога, сензори могу бити:

  • На основу хардвера. То су физичке компоненте које су уграђене у уређај и директно мере специфична својства, попут убрзања или јачине околних геомагнетних поља.
  • Софтверски заснован, понекад познат и као виртуални сензори или композитни сензори. Они обично сакупљају податке с више сензора заснованих на хардверу. На крају овог чланка радићемо са сензором вектора ротације, који је софтверски сензор који комбинује податке са акцелерометром, магнетометром и жироскопом уређаја.

Сензори околине: Мерење амбијенталне светлости

Андроид-ов сензор за светлост мери околну светлост у „лук“ јединицама, што је интензитет светлости какав опажа људско око. Вриједност луксуза коју извјештава сензор може се разликовати на различитим уређајима, тако да ако вашој апликацији требају сталне вриједности, можда ћете морати манипулирати са сировим подацима прије него што их користите у својој апликацији.


У овом одељку направићемо апликацију која из сензора светлости уређаја преузима тренутну вредност лукса, приказује је у ТектВиев-у, а затим ажурира ТектВиев када нови подаци постану доступни.Затим можете да користите ове информације у разним апликацијама, на пример, можете да направите апликацију за бакљаду која извлачи информације са сензора светлости и затим аутоматски подешава јачину свог снопа на основу тренутног нивоа светлости.

Направите нови Андроид пројекат са подешавањима по вашем избору и кренимо!

Приказивање података вашег сензора

Додаћу ТектВиев који ће на крају приказати податке које смо извукли из сензора светлости. Овај ТектВиев ће се ажурирати кад год постану доступни нови подаци тако да корисник увек има приступ најновијим информацијама.

Отворите датотеку Ацтивити_маин.кмл вашег пројекта и додајте следеће:

Затим треба да креирамо извор низа „лигхт_сенсор“ који се наводи у нашем изгледу. Отворите датотеку стрингс.кмл вашег пројекта и додајте следеће:

Сензор светлости:% 1 $ .2ф

„% 1 $ .2ф“ је резервирано место које специфицира информације које желимо да прикажемо и како их треба форматирати:

  • %1. У исти извор стринга можете уметнути више резервираних места; „% 1“ означава да користимо једно резервирано место.
  • $.2. Ово специфицира како наша апликација треба форматирати сваку долазну вриједност с помичном зарезом. "$ .2" означава да вредност треба заокружити на два децимална места.
  • Ф. Форматирајте вредност као број с помичном зарезом.

Иако су неки сензори уобичајени од других, никада не треба претпоставити да сваки уређај има приступ потпуно истом хардверу и софтверу. Доступност сензора може чак варирати у различитим верзијама Андроида, јер неки сензори нису представљени до каснијих издања Андроид платформе.

Помоћу оквира Андроид сензора можете проверити да ли је одређени сензор присутан на уређају. Затим можете да онемогућите или омогућите делове апликације на основу доступности сензора или можете да прикажете објашњење да неке функције ваше апликације неће радити како се очекује.

Док је наша датотека стрингс.кмл отворена, направимо низ "но_сенсор", који ћемо приказати ако сензор светлости није доступан:

Сензор светлости није доступан

Ако ваша апликација не може пружити добро корисничко искуство без приступа одређеном сензору, те податке морате додати у свој Манифест. На пример, ако вашој апликацији треба приступ сензору компаса, можете да користите следеће:

Сада се ваша апликација може преузимати само на уређаје који имају сензор компаса.

Иако ово може да ограничи вашу публику, далеко је мање штетно од омогућавања некоме да преузме вашу апликацију када је доступан гарантовано да имају лоше искуство због конфигурације сензора на уређају.

Комуникација са сензором: СенсорМанагер, СенсорЕвентс и слушаоци

Да бисте комуницирали са сензором светлости уређаја, морате да извршите следеће кораке:

1. Набавите инстанцу СенсорМанагер-а

СенсорМанагер пружа све методе које су вам потребне за приступ читавом спектру уређаја.

За почетак, направите променљиву која ће садржати инстанцу СенсорМанагер:

приватни СенсорМанагер лигхтСенсорМанагер;

Затим морате добити инстанцу СенсорМанагер-а позивањем методе Цонтект.гетСистемСервице и прослеђивањем аргумента Цонтект.СЕНСОР_СЕРВИЦЕ:

лигхтСенсорМанагер = (СенсорМанагер) гетСистемСервице (Цонтект.СЕНСОР_СЕРВИЦЕ);

2. Набавите референцу на лигхтТектВиев

Затим морамо креирати променљиву приватног члана која ће задржати наше ТектВиев објекте и доделити је нашем ТектВиев:

приватни ТектВиев лигхтТектВиев; ... ... ... лигхтТектВиев = (ТектВиев) финдВиевБиИд (Р.ид.лигхтТектВиев);

3. Проверите да ли постоји сензор на тренутном уређају

Можете добити приступ одређеном сензору тако што ћете позвати методу гетДефаултСенсор (), а затим проследити предметни сензор. Константа типа за сензор светлости је ТИПЕ_ЛИГХТ, тако да требамо користити следеће:

лигхтСенсор = лигхтСенсорМанагер.гетДефаултСенсор (Сенсор.ТИПЕ_ЛИГХТ);

Ако сензор не постоји на овом уређају, тада ће метода гетДефаултСенсор () вратити нулу, а ми ћемо приказати низ "но_сенсор":

Стринг сенсор_еррор = гетРесоурцес (). ГетСтринг (Р.стринг.но_сенсор); иф (лигхтСенсор == нулл) {лигхтТектВиев.сетТект (сенсор_еррор); }}

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

Сваки пут када сензор има нове податке, Андроид генерише објект СенсорЕвент. Овај СенсорЕвент објект укључује сензор који је генерирао догађај, временску ознаку и нову вриједност података.

У почетку ћемо се фокусирати на сензоре светлости и близине, који враћају један једини податак. Међутим, неки сензори дају вишедимензионалне низове за сваки СенсорЕвент, укључујући сензор вектора ротације, који ћемо истражити до краја овог чланка.

Да бисмо осигурали да је наша апликација обавештена о овим објектима СенсорЕвент, морамо да региструјемо слушаоца за тај одређени догађај сензора, користећи регистратор листе СенсорМанагер-а ().

Метода регистерЛистенер () узима следеће аргументе:

  • Контекст апликације или активности
  • Тип сензора који желите да надгледате.
  • Брзина којом сензор треба послати нове податке. Виша стопа пружиће вашој апликацији више података, али ће такође користити више ресурса система, посебно радног века батерије. Да бисте сачували батерију уређаја, затражите минималну количину података коју захтева ваша апликација. Користићу СенсорМанагер.СЕНСОР_ДЕЛАИ_НОРМАЛ, који шаље нове податке једном у 200.000 микросекунди (0.2 секунди).

Будући да слушање сензора троши батерију уређаја, никада не бисте требали регистровати слушаоце у својој апликацији онЦреате () методом, јер ће то узроковати да сензори наставе са слањем података, чак и када је апликација у позадини.

Уместо тога, требало би да региструјете своје сензоре у методи животног циклуса апликацијеСтарт () апликације:

@Оверриде заштићен воид онСтарт () {супер.онСтарт (); // Ако је сензор доступан на тренутном уређају ... // иф (лигхтСенсор! = Нулл) {//…. Онда започните слушање // лигхтСенсорМанагер.регистерЛистенер (ово, лигхтСенсор, СенсорМанагер.СЕНСОР_ДЕЛАИ_НОРМАЛ); }}

5. Укључите повратне позиве СенсорЕвентЛистенер

СенсорЕвентЛистенер је интерфејс који прима обавештења од СенсорМанагер
кад год су доступни нови подаци или се тачност сензора мења.

Први корак је модификација потписа наше класе за имплементацију СенсорЕвентЛистенер интерфејса:

МаинАцтивити у јавној класи проширује АппЦомпатАцтивити имплементира СенсорЕвентЛистенер {

Тада морамо да применимо следеће методе повратног позива:

онСенсорЦхангед ()

Ова метода се позива као одговор на сваки нови СенсорЕвент.

Подаци о сензорима често се могу брзо мењати, тако да ваша апликација може редовно позивати онСенсорЦхангед () методу. Да бисте лакше водили апликацију, требало би да обавите што мање посла унутар методе онСенсорЦхангед ().

@Оверриде публиц воид онСенсорЦхангед (СенсорЕвент сенсорЕвент) {// То //

онАццурациЦхангед ()

Ако се тачност сензора побољша или одбије, Андроид ће назвати методу онАццурациЦхангед () и прослиједити му објект Сенсор који садржи нову вриједност тачности, попут СЕНСОР_СТАТУС_УНРЕЛИАБЛЕ или СЕНСОР_СТАТУС_АЦЦУРАЦИ_ХИГХ.

Сензор светлости не извештава о променама тачности, па ћу позив за повратак позива онАццурациЦхангед () оставити празан:

@Оверриде јавна неважећа онАццурациЦхангед (Сензор сензора, инт и) {// То ///}}

6. Дохватите вредност сензора

Кад год имамо нову вредност, потребно је да позовемо онСенсорЦхангед () методу и извучемо низ "лигхт_сенсор". Тада можемо да надјачамо заменски текст низа (% 1 $ .2ф) и прикажемо ажурирани низ као део нашег ТектВиев-а:

@Оверриде публиц воид онСенсорЦхангед (СенсорЕвент сенсорЕвент) {// тренутна вредност сензора // флоат цуррентВалуе = сенсорЕвент.валуес; // Дохватите стринг „лигхт_сенсор“, уметните нову вредност и прикажите је кориснику // лигхтТектВиев.сетТект (гетРесоурцес (). ГетСтринг (Р.стринг.лигхт_сенсор, цуррентВалуе)); }

7. Одјавите своје слушатеље

Сензори могу да генеришу велике количине података у малом времену, тако да ће вам требати да сачувате ресурсе уређаја који ће вам требати да региструјете слушатеље када вам више нису потребни.

Да бисте престали слушати догађаје сензора када је ваша апликација у позадини, додајте нерегистрираниЛистенер () у методу животног циклуса онСтоп () пројекта:

@Оверриде заштићен воид онСтоп () {супер.онСтоп (); лигхтСенсорМанагер.унрегистерЛистенер (ово); }

Имајте на уму да не бисте требали да региструјете слушатеље у програму ОнПаусе (), као што је то случај са Андроидом 7.0 и старијим апликацијама које могу да се покрећу у режиму раздељеног екрана и слике у слици, где су у паузираном стању, али остају видљиви на екрану.

Коришћење Андроид-ових сензора светлости: Довршени код

Након довршетка свих горе наведених корака, МаинАцтивити вашег пројекта требало би изгледати овако:

импорт андроид.суппорт.в7.апп.АппЦомпатАцтивити; импорт андроид.ос.Бундле; импорт андроид.цонтент.Цонтект; импорт андроид.хардваре.Сенсор; импорт андроид.хардваре.СенсорЕвент; импорт андроид.хардваре.СенсорЕвентЛистенер; импорт андроид.хардваре.СенсорМанагер; импорт андроид.видгет.ТектВиев; јавна класа МаинАцтивити проширује АппЦомпатАцтивити // Имплементира СенсорЕвентЛистенер сучеље // имплементира СенсорЕвентЛистенер {// Креирајте своје променљиве // привате Сенсор лигхтСенсор; приватни СенсорМанагер лигхтСенсорМанагер; приватни ТектВиев лигхтТектВиев; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); лигхтТектВиев = (ТектВиев) финдВиевБиИд (Р.ид.лигхтТектВиев); // Набавите инстанцу СенсорМанагер // лигхтСенсорМанагер = (СенсорМанагер) гетСистемСервице (Цонтект.СЕНСОР_СЕРВИЦЕ); // Проверите сензор светлости // лигхтСенсор = лигхтСенсорМанагер.гетДефаултСенсор (Сенсор.ТИПЕ_ЛИГХТ); // Ако сензор светлости не постоји, прикажите грешку // Стринг сенсор_еррор = гетРесоурцес (). ГетСтринг (Р.стринг.но_сенсор); иф (лигхтСенсор == нулл) {лигхтТектВиев.сетТект (сенсор_еррор); }} @ Пребрисана заштићена воид онСтарт () {супер.онСтарт (); // Ако је сензор доступан на тренутном уређају ... // иф (лигхтСенсор! = Нулл) {//….тхе региструјте слушаоца // лигхтСенсорМанагер.регистерЛистенер (ово, лигхтСенсор, // Специфицирајте колико често желите да примати нове податке // СенсорМанагер.СЕНСОР_ДЕЛАИ_НОРМАЛ); }} @ Пребрисана заштићена празнина онСтоп () {супер.онСтоп (); // Поништи регистрацију свог слушаоца // лигхтСенсорМанагер.унрегистерЛистенер (ово); } @ Пребрисати јавну неважећу онСенсорЦхангед (СенсорЕвент сенсорЕвент) {// Тренутна вредност сензора // флоат цуррентВалуе = сенсорЕвент.валуес; // Дохватите стринг „лигхт_сенсор“, уметните нову вредност и ажурирајте ТектВиев // лигхтТектВиев.сетТект (гетРесоурцес (). ГетСтринг (Р.стринг.лигхт_сенсор, цуррентВалуе)); } @ Овервериде // Ако се тачност сензора промени… .// јавна празнина онАццурациЦхангед (Сензор сензора, инт и) {// ТО ДО //}}

Тестирајте довршену апликацију за сензоре за Андроид

Да бисте тестирали ову апликацију на физичком Андроид паметном телефону или таблету:

  • Инсталирајте пројекат на свој уређај (одабиром „Покрени> Покрени“ на траци са алаткама Андроид Студио).
  • Иако се разликује између уређаја, сензор светлости се често налази у горњем десном углу екрана. Да бисте манипулирали нивоима светлости, померите свој уређај ближе, а затим даље од извора светлости. Алтернативно, можете покушати покрити уређај руком како бисте блокирали светло. Вредност „Сензора светлости“ требало би да се повећава и смањује, у зависности од количине доступне светлости.

Ако користите Андроид виртуелни уређај (АВД), емулатор има скуп виртуелних сензорских контрола које можете да користите за симулирање различитих догађаја сензора. Овим виртуалним контролама сензора приступате кроз прозор "Ектендед Цонтролс" емулатора:

  • Инсталирајте апликацију на свој АВД.
  • Поред АВД-а видећете траку дугмади. Пронађите трочлано дугме „Више“ (где је курсор постављен на следећем снимку екрана) и кликните на њега. Ово отвара прозор „Проширене контроле“.

  • У левом менију изаберите „Виртуелни сензори“.
  • Одаберите картицу „Додатни сензори“. Ова картица садржи разне клизаче које можете користити за симулацију различитих догађаја и положаја сензора у окружењу.

  • Пронађите клизач „Лигхт (лук)“ и превуците га улево и удесно, да бисте променили симулирани ниво светлости. Ваша апликација треба да прикаже ове променљиве вредности у реалном времену.

Готов пројекат можете преузети са ГитХуб-а.

Мерење растојања, помоћу Андроид сензора близине

Сада смо видели како да преузмете информације са сензора заштите животне средине, погледајмо како ћете применити ово знање на положај сензор.

У овом одељку користићемо сензор близине уређаја за надгледање удаљености између вашег паметног телефона или таблета и других објеката. Ако ваша апликација има било какву функцију гласа, тада вам сензор близине може помоћи да одредите када се паметни телефон држи за ухо корисника, на пример када води телефонски разговор. Затим можете да користите ове информације да бисте онемогућили додирне догађаје, тако да корисник случајно не прекине или покрене друге нежељене догађаје током разговора.

Креирање корисничког интерфејса

Приказаћу податке о близини на екрану, тако да можете гледати како се ажурирају у стварном времену. Да бисмо вам олакшали ствари, искористимо већи део изгледа из наше претходне апликације:

Затим отворите датотеку стрингс.кмл и креирајте низ „прокимити_сенсор“. Још једном, овај низ треба да садржи резервирано место које ће на крају бити попуњено подацима извађеним из сензора близине:

ПрокимитиСенсор Сензор близине:% 1 $ .2ф Сензор близине није доступан

Добијање података са сензора близине

Слично као сензор светлости, Андроид-ов сензор близине враћа јединствену вредност података, што значи да можемо да поново користимо већи део кода из наше претходне апликације. Међутим, постоји неколико главних разлика плус неке промене у вези са називом које олакшавају праћење овог кода:

  • Направите инстанцу СенсорМанагер коју ћу овај пут назвати „близинаСенсорМанагер“.
  • Добијте инстанцу „близинеСенсорМанагер“.
  • Креирајте референцу на „прокимитиТектВиев“.
  • Назовите методу гетДефаултСенсор () и прослиједите јој ТИПЕ_ПРОКСИМИТИ сензор.
  • Региструјте и одјавите слушатеље за сензор близине.

Након што направите ове промене, требало би да завршите са следећим:

импорт андроид.суппорт.в7.апп.АппЦомпатАцтивити; импорт андроид.ос.Бундле; импорт андроид.цонтент.Цонтект; импорт андроид.хардваре.Сенсор; импорт андроид.хардваре.СенсорЕвент; импорт андроид.хардваре.СенсорМанагер; импорт андроид.хардваре.СенсорЕвентЛистенер; импорт андроид.видгет.ТектВиев; јавна класа МаинАцтивити проширује апликацију АппЦомпатАцтивити // Имплементира СенсорЕвентЛистенер сучеље // имплементира СенсорЕвентЛистенер {// Креирајте своје променљиве // приватни сензор близинаСенсор; приватна близина СенсорМанагерСенсорМанагер; приватна ТектВиев близинаТектВиев; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); прокимитиТектВиев = (ТектВиев) финдВиевБиИд (Р.ид.прокимитиТектВиев); // Набавите инстанцу СенсорМанагер // прокимитиСенсорМанагер = (СенсорМанагер) гетСистемСервице (Цонтект.СЕНСОР_СЕРВИЦЕ); // Проверите сензор близине // близинаСенсор = близинаСенсорМанагер.гетДефаултСенсор (Сенсор.ТИПЕ_ПРОКСИМИТИ); // Ако сензор близине не постоји, прикажите грешку // Стринг сенсор_еррор = гетРесоурцес (). ГетСтринг (Р.стринг.но_сенсор); ако (прокимитиСенсор == нулл) {прокимитиТектВиев.сетТект (сенсор_еррор); }} @ Пребрисана заштићена воид онСтарт () {супер.онСтарт (); // Ако је сензор доступан на тренутном уређају ... // иф (близинаСенсор! = Нулл) {//... примати нове податке // СенсорМанагер.СЕНСОР_ДЕЛАИ_НОРМАЛ); }} @ Пребрисана заштићена празнина онСтоп () {супер.онСтоп (); // Одјавите слушатеља да бисте сачували системске ресурсе // прокимитиСенсорМанагер.унрегистерЛистенер (ово); } @ Пребрисати јавну неважећу онСенсорЦхангед (СенсорЕвент сенсорЕвент) {// Тренутна вредност сензора // флоат цуррентВалуе = сенсорЕвент.валуес; // Дохватите стринг „прокимити_сенсор“, уметните нову вредност и ажурирајте ТектВиев // прокимитиТектВиев.сетТект (гетРесоурцес (). ГетСтринг (Р.стринг.прокимити_сенсор, цуррентВалуе)); } @ Овервериде // Ако се тачност сензора промени… .// јавна празнина онАццурациЦхангед (Сензор сензора, инт и) {//...ТО ДО //}}

Тестирање: Колико је корисник у близини уређаја?

Да бисте ову апликацију тестирали на физички Андроид паметни телефон или таблет, инсталирајте апликацију на свој уређај, а затим експериментирајте померањем руке према екрану, а затим је поново одмакните. Вредност „Сензор близине“ требало би да бележи ваше кретање.

Имајте на уму да сензори близине могу варирати између уређаја. Неки уређаји могу приказати само две вредности близине - једна за означавање „Близу“ и једна за „Далеко“ - тако да се не чудите ако на физичком Андроид уређају не видите много разноликости.

Да бисте тестирали ову апликацију на емулатору:

  • Инсталирајте апликацију на АВД.
  • Пронађите трочлано дугме „Више“ и додајте му клик, чиме се отвара прозор „Проширене контроле“.
  • У левом менију прозора изаберите „Виртуелни сензори“.
  • Одаберите картицу „Додатни сензори“.
  • Пронађите клизач „Прокимити“ и превуците га улево и удесно да бисте опонашали објект који се приближава уређају, а затим даље. Вредности „Сензор близине“ требало би да се мењају током манипулације клизачем.

Готов пројекат можете преузети са ГитХуб-а.

Сензори покрета: Обрада вишедимензионалних низова

До овог тренутка фокусирали смо се на сензоре који испоручују једну јединицу података, али постоје неки сензори који пружају вишедимензионалне низове за сваки СенсорЕвент. Ови вишедимензионални сензори укључују сензоре кретања, на које ћемо се фокусирати у последњем одељку.

Сензори покрета могу вам помоћи:

  • Наведите алтернативни начин уноса корисника. На пример, ако развијате мобилну игру, корисник може да премешта њихов лик по екрану нагињући свој уређај.
  • Активност корисника. Ако сте направили апликацију за праћење активности, сензори кретања могу вам помоћи да процените да ли корисник путује у аутомобилу, трчи или седи за својим столом.
  • Тачније одредите оријентацију.Могуће је извући координате из сензора кретања уређаја, а затим их превести на основу Земљиног координатног система да бисте добили најтачнији увид у тренутну оријентацију уређаја.

У овом последњем одељку користићемо сензор вектора ротације (ТИПЕ_РОТАТИОН_ВЕЦТОР). За разлику од сензора светлости и близине, ово је софтверски сензор који обједињује податке са сензора акцелерометра, магнетометра и жироскопа уређаја. Иако рад са овим сензором често захтева од вас да извршите математичке претворбе и трансформације, он вам такође може пружити низ врло тачних информација о уређају.

Направит ћемо апликацију која користи сензор вектора ротације за мјерење:

  • Питцх. Ово је нагиб уређаја од врха до дна.
  • Ролл. Ово је нагиб уређаја са леве на десно.

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

Пошто меримо две метрике, морамо да направимо два ТектВиев-а и два одговарајућа стринг-извора:

Отворите датотеку стрингс.кмл и додајте следеће:

МотионСенсорс Нагиб сензора:% 1 $ .2ф Роло сензор:% 1 $ .2ф Нема расположивих сензора кретања

Коришћење сензора вектора ротације у вашој апликацији

Поновно ћемо користити неки код из претходних апликација, па се фокусирајмо на подручја где је комуникација са сензором вектора ротације значајно другачија од онога што смо видели раније.

1. Користите ТИПЕ_РОТАТИОН_ВЕЦТОР

Будући да радимо са сензором вектора ротације, морамо позвати методу гетДефаултСенсор (), а затим јој пренети константу ТИПЕ_РОТАТИОН_ВЕЦТОР:

ПоситионСенсорМанагер.гетДефаултСенсор (Сенсор.ТИПЕ_РОТАТИОН_ВЕЦТОР);

2. Преведи податке сензора

За разлику од претходних сензора светлости и близине, сензори кретања враћају вишедимензионалне низове сензорских вредности за сваки СенсорЕвент. Ове вредности се форматирају коришћењем стандардног „Кс, И, З“ координатног система, који се израчунава у односу на уређај када се држи у својој подразумеваној „природној“ оријентацији.

Андроид не мења ове Кс, И и З координате око које се подударају са тренутном оријентацијом уређаја, тако да ће „Кс“ оса остати иста без обзира да ли је уређај у портретном или пејзажном режиму. Када користите сензор вектора ротације, можда ћете требати претворити долазне податке да би се подударали са тренутним ротирањем уређаја.

Портрет је подразумевана оријентација за већину паметних телефона, али не треба претпостављати да ће то бити случај све Андроид уређаји, посебно таблети. У овом ћемо чланку користити ротацијску матрицу за преношење података сензора из његових оригиналних, уређај координатног система, до Земљина координатни систем, који представља кретање и положај уређаја у односу на Земљу. По потреби можемо поново преправити податке сензора, на основу тренутне оријентације уређаја.

Прво, координатни систем уређаја је стандардни Кс, И, З координатни систем Кс, И, З, где је свака тачка на свакој од три осе представљена 3Д вектором. То значи да морамо створити низ од 9 флоат вриједности:

флоат ротацијаМатрик = нови пловак;

Затим можемо проследити овај низ методи гетРотатионМатрик ():

СенсорМанагер.гетРотатионМатрикФромВецтор (ротацијаМатрик, вектори); инт ворлдАкисКс = СенсорМанагер.АКСИС_Кс; инт ворлдАкисЗ = СенсорМанагер.АКСИС_З;

Следећи корак је коришћење методе СенсорМанагер.ремапЦоординатеСистем () за поновно подешавање података сензора на основу тренутне оријентације уређаја.

Метода СенсорМанагер.ремапЦоординатеСистем () узима следеће аргументе:

  • Оригинална матрица ротације.
  • Секире које желите да ресетирате.
  • Низ који попуњавате овим новим подацима.

Ево кода који ћу користити у својој апликацији:

флоат прилагођенРотатионМатрик = нови пловак; СенсорМанагер.ремапЦоординатеСистем (ротацијаМатрик, ворлдАкисКс, ворлдАкисЗ, прилагођенаРотатионМатрик);

На крају, назваћемо СенсорМанагер.гетОриентатион и рећи му да користи прилагођениРотатионМатрик:

СенсорМанагер.гетОриентатион (прилагођенаРотатионМатрик, оријентација);

3. Ажурирајте жице резервираног места

Обзиром да имамо два скупа података (питцх и ролл), морамо да пронађемо две одвојене стрингове резервираног места, попунимо их тачним вредностима, а затим ажурирамо одговарајући ТектВиев:

питцхТектВиев.сетТект (гетРесоурцес (). гетСтринг (Р.стринг.питцх_сенсор, питцх)); роллТектВиев.сетТект (гетРесоурцес (). гетСтринг (Р.стринг.ролл_сенсор, ролл));

Приказивање више података сензора: Довршени код

Након извођења горњих корака, ваша МаинАцтивити треба изгледати овако:

импорт андроид.апп.Ацтивити; импорт андроид.ос.Бундле; импорт андроид.хардваре.Сенсор; импорт андроид.хардваре.СенсорЕвент; импорт андроид.хардваре.СенсорЕвентЛистенер; импорт андроид.хардваре.СенсорМанагер; импорт андроид.видгет.ТектВиев; јавна класа МаинАцтивити проширује активност имплементира СенсорЕвентЛистенер {привате СенсорМанагер мотионСенсорМанагер; приватни сензор покретаСензор; приватни ТектВиев питцхТектВиев; приватни ТектВиев роллТектВиев; приватни статички коначни инт СЕНСОР_ДЕЛАИ = 500 * 1000; приватни статички коначни инт ФРОМ_РАДС_ТО_ДЕГС = -57; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); питцхТектВиев = (ТектВиев) финдВиевБиИд (Р.ид.питцхТектВиев); роллТектВиев = (ТектВиев) финдВиевБиИд (Р.ид.роллТектВиев); пробајте {мотионСенсорМанагер = (СенсорМанагер) гетСистемСервице (Ацтивити.СЕНСОР_СЕРВИЦЕ); мотионСенсор = мотионСенсорМанагер.гетДефаултСенсор (Сенсор.ТИПЕ_РОТАТИОН_ВЕЦТОР); мотионСенсорМанагер.регистерЛистенер (ово, мотионСенсор, СЕНСОР_ДЕЛАИ); } хватање (изузетак е) {питцхТектВиев.сетТект (Р.стринг.но_сенсор); роллТектВиев.сетТект (Р.стринг.но_сенсор); }} @ Пребрисати јавну неважећу онАццурациЦхангед (Сензор сензора, инт тачност) {// Да то урадите //} @ Пребрисати јавну неважећуСенсорЦхангед (СенсорЕвент догађај) {иф (евент.сенсор == мотионСенсор) {упдате (евент.валуес); }} приватно ажурирање празнина (флоат вектори) {// Израчунавање матрице ротације // флоат ротатионМатрик = нови флоат; СенсорМанагер.гетРотатионМатрикФромВецтор (ротацијаМатрик, вектори); инт ворлдАкисКс = СенсорМанагер.АКСИС_Кс; инт ворлдАкисЗ = СенсорМанагер.АКСИС_З; // Ремап матрике на основу тренутне оријентације активности // флоат прилагођенРотатионМатрик = нови флоат; СенсорМанагер.ремапЦоординатеСистем (ротацијаМатрик, ворлдАкисКс, ворлдАкисЗ, прилагођенаРотатионМатрик); // Израчунавање оријентације уређаја // пловна оријентација = нови пловак; // Доставите низ флоат вриједности методи гетОриентатион () // СенсорМанагер.гетОриентатион (прилагођенаРотатионМатрик, оријентација); плутајући корак = оријентација * ФРОМ_РАДС_ТО_ДЕГС; флоат ролл = оријентација * ФРОМ_РАДС_ТО_ДЕГС; // Ажурирајте ТектВиевс вредностима висине тона и рола // питцхТектВиев.сетТект (гетРесоурцес (). ГетСтринг (Р.стринг.питцх_сенсор, питцх)); роллТектВиев.сетТект (гетРесоурцес (). гетСтринг (Р.стринг.ролл_сенсор, ролл)); }}

Готов пројекат можете преузети са ГитХуб-а.

Тестирање наше финалне апликације за сензоре за Андроид

Да бисте тестирали ову векторску ротациону апликацију за Андроид сензор на физичком Андроид паметном телефону или таблету:

  • Инсталирајте апликацију на свој уређај.
  • Поставите паметни телефон или таблет на равну површину. Имајте на уму да су сензори кретања изузетно осетљиви, тако да није необично да уређај наизглед непомично пријављује флуктуације у вредностима нагиба и нагиба.
  • Да бисте тестирали висину, подигните дно уређаја тако да се нагиње даље од вас. Вредност нагиба требало би драматично да се промени.
  • Да бисте тестирали ролну, покушајте да подигнете леву страну уређаја, тако да се нагиње улево - пазите на ту вредност ролне!

Ако тестирате свој пројекат на емулатору:

  • Инсталирајте апликацију на свој АВД.
  • Изаберите „Још“, што отвара прозор „Проширене контроле“.
  • У левом менију изаберите „Виртуелни сензори“.
  • Провјерите је ли одабрана картица „Акцелерометар“. Ова картица садржи контроле које могу да симулирају промене у положају и оријентацији уређаја.
  • Покушајте експериментирати са различитим клизачима (Ротате: З-Рот, Кс-Рот, И-Рот; и Помицање: Кс, И и З) и разним типкама „Ротатион Девице“ (ротација уређаја) да бисте видјели како утјечу на „Сенсор Ролл“ ваше апликације. "И" Питцх Сенсор "вредности.

Окончање

У овом чланку смо видели како дохватити податке из три главне категорије Андроид сензора: околина, положај и кретање и како надгледати те податке у реалном времену.

Да ли сте видели неку Андроид апликацију која користи сензоре на занимљив или јединствен начин? Јавите нам у коментарима испод!

Коришћење паметног телефона или таблета за учење из свега има смисла. То је уређај који је скоро увек са вама, што значи да можете да понесете своје знање свуда и постоји метричка тона ресурса да вас...

Андроид закључани екран развијао се много пута током година. Било је разних метода пребацивања до откључавања и ОЕМ произвођачи су одувек вршили ствари. Како се испоставило, у Плаи Сторе-у постоји и ...

Избор Локације