Androidi peamised andurid: riistvara, tarkvara ja mitmemõõtmeline

Autor: John Stephens
Loomise Kuupäev: 26 Jaanuar 2021
Värskenduse Kuupäev: 5 Juuli 2024
Anonim
Androidi peamised andurid: riistvara, tarkvara ja mitmemõõtmeline - Rakendused
Androidi peamised andurid: riistvara, tarkvara ja mitmemõõtmeline - Rakendused

Sisu


Tänapäeval on enamus kaasaegseid Android-seadmeid komplekteeritud hunniku anduritega.

Saate seda teavet kasutada paljudel erinevatel viisidel - kas see jälgib valgustustaset, et teie rakendus saaks automaatselt reguleerida selle heledust või värviskeemi; võimaldades kasutajal su mobiilimänguga suhelda, kasutades žeste, näiteks oma seadme kallutamist; või lähedussensori kasutamine puuteürituste automaatseks keelamiseks, kui kasutaja hoiab oma seadet kõrva ääres.

Selles artiklis loome kolm rakendust, mis hangivad valguse, läheduse ja liikumise andmeid mitmesugustest riist- ja tarkvaraanduritest. Jälgime neid Androidi andureid ka reaalajas, nii et teie rakendusel on alati juurdepääs uusimale teabele.

Selle artikli lõpuks teate, kuidas Androidi andurilt üksikuid andmeid eraldada ja kuidas käidelda andureid, mis annavad oma andmeid mitmemõõtmelise massiivi kujul.


Milliseid Androidi andureid saan kasutada?

Androidi andurid võib jagada järgmistesse kategooriatesse:

  • Keskkonnaandurid. Need mõõdavad keskkonnatingimusi, nagu õhutemperatuur, rõhk, õhuniiskus ja ümbritseva valguse tase.

  • Positsiooniandurid. Sellesse kategooriasse kuuluvad andurid, mis mõõdavad seadme füüsilist positsiooni, näiteks lähedussensorid ja geomagnetilise välja andurid.
    Liikumisandurid. Need sensorid mõõdavad seadme liikumist ja hõlmavad kiirendusmõõtjaid, gravitatsiooniandureid, güroskoope ja pöörlemisvektoriandureid.

Lisaks võivad andurid olla kas:

  • Riistvaraline. Need on füüsilised komponendid, mis on seadmesse sisse ehitatud ja mõõdavad otseselt spetsiifilisi omadusi, näiteks kiirendust või ümbritsevate geomagnetiliste väljade tugevust.
  • Tarkvarapõhised, mõnikord tuntud kui virtuaalsed andurid või liitandurid. Tavaliselt koguvad need andmeid mitmelt riistvarapõhiselt andurilt. Selle artikli lõpupoole töötame koos pöörlemisvektorianduriga, mis on tarkvaraandur, mis ühendab andmeid seadme kiirendusmõõturi, magnetomeetri ja güroskoobi kohta.

Keskkonnaandurid: ümbritseva valguse mõõtmine

Androidi valgussensor mõõdab ümbritsevat valgust luksides, mis on inimese silma tajutav valguse intensiivsus. Anduri esitatud luksi väärtus võib seadmetes erineda, nii et kui teie rakendus nõuab püsiväärtusi, peate võib-olla töötlema töötlemata andmeid enne selle kasutamist oma rakenduses.


Selles jaotises loome rakenduse, mis hangib seadme valgusandurilt praeguse luksi väärtuse, kuvab selle TextView-vormingus ja värskendab seejärel TextView-vormingut, kui uued andmed muutuvad kättesaadavaks.Seejärel saate seda teavet kasutada mitmesugustes rakendustes, näiteks võite luua taskulambirakenduse, mis tõmbab valguseandurilt teavet ja reguleerib seejärel selle kiire tugevust automaatselt vastavalt praegusele valgustasemele.

Looge uus Android-projekt teie valitud seadetega ja alustame!

Anduri andmete kuvamine

Lisan tekstivaate, mis kuvab lõpuks andmed, mille oleme valguseandurist ekstraheerinud. Seda tekstivaadet värskendatakse, kui uued andmed on saadaval, seega on kasutajal alati juurdepääs uusimale teabele.

Avage oma projekti tegevus_main.xml-fail ja lisage järgmine teave:

Järgmisena peame looma stringi ressursi “light_sensor”, millele on viidatud meie paigutuses. Avage projekti strings.xml fail ja lisage järgmine teave:

Valgussensor:% 1 $ .2f

„% 1 $ .2f” on kohahoidja, mis täpsustab teabe, mida me kuvada soovime ja kuidas seda tuleks vormindada:

  • %1. Samasse stringi ressurssi saab sisestada mitu kohahoidjat; „% 1” näitab, et kasutame ühte kohatäidet.
  • $.2. See täpsustab, kuidas meie rakendus peaks iga sissetulevat ujukoma väärtust vormindama. “$ .2” näitab, et väärtus tuleks ümardada kahe kümnendkoha täpsusega.
  • F. Vormindage väärtus ujukomaga.

Kuigi mõned andurid on tavalisemad kui teised, ei tohiks te kunagi eeldada, et igal seadmel on juurdepääs täpselt samale riist- ja tarkvarale. Andurite saadavus võib erinevates Androidi versioonides erineda, kuna mõnda andurit tutvustati alles Androidi platvormi hilisemates versioonides.

Androidi andurite raamistiku abil saate kontrollida, kas seadmel on mõni konkreetne andur. Seejärel saate sensori saadavuse põhjal oma rakenduse osad keelata või lubada või kuvada selgituse, et mõned teie rakenduse funktsioonid ei tööta ootuspäraselt.

Kui meil on fail strings.xml avatud, loome stringi „no_sensor”, mis kuvatakse, kui valgussensor pole saadaval:

Valgusandurit pole saadaval

Kui teie rakendus ei saa ilma kindlale andurile juurdepääsuta pakkuda head kasutajakogemust, peate selle teabe oma manifesti lisama. Näiteks kui teie rakendus nõuab juurdepääsu kompassensorile, saate kasutada järgmist.

Nüüd saab teie rakenduse alla laadida ainult seadmetes, millel on kompassensor.

Ehkki see võib teie vaatajaskonda piirata, on see palju vähem kahjulik kui see, kui lubate kellelgi teie rakenduse alla laadida, kui ta on tagatud seadme sensori konfiguratsiooni tõttu halva kogemuse saamiseks.

Anduriga suhtlemine: SensorManager, SensorEvents ja kuulajad

Seadme valguseanduriga suhtlemiseks peate tegema järgmised sammud:

1. Hankige SensorManageri eksemplar

SensorManager pakub kõiki meetodeid, mida vajate seadme täielikule andurile juurdepääsuks.

Alustamiseks looge muutuja, mis sisaldab SensorManageri eksemplari:

privaatne SensorManager lightSensorManager;

Seejärel peate hankima SensorManageri eksemplari, helistades Context.getSystemService meetodile ja sisestades Context.SENSOR_SERVICE argumendi:

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

2. Hankige viide lightTextView-le

Järgmisena peame looma privaatse liikmemuutuja, mis hoiab meie TextView-objekte, ja määrama selle meie TextView-le:

privaatne TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. Kontrollige, kas andur on praeguses seadmes olemas

Kindlale andurile pääsete juurde, helistades meetodile getDefaultSensor () ja edastades seejärel selle anduri. Valgussensori tüüpkonstant on TYPE_LIGHT, seega peame kasutama järgmist:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Kui andurit selles seadmes ei eksisteeri, tagastatakse meetod getDefaultSensor () nulliks ja kuvame stringi „no_sensor”:

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

4. Registreerige oma sensori kuulajad

Iga kord, kui anduril on uusi andmeid, genereerib Android SensorEvent objekti. See objekt SensorEvent sisaldab sündmuse genereerinud andurit, ajatemplit ja uut andmeväärtust.

Esialgu keskendume valguse ja läheduse anduritele, mis tagastavad ühe andmesidetüki. Mõned andurid pakuvad iga SensorEvent jaoks mitmemõõtmelisi massiive, sealhulgas pöörlemisvektoriandurit, mida uurime selle artikli lõpus.

Tagamaks, et meie rakendust teavitatakse nende SensorEvent-objektide kohta, peame registreerima selle konkreetse andurisündmuse kuulaja, kasutades SensorManageri registerListener ().

Meetod registerListener () võtab järgmised argumendid:

  • Rakenduse või tegevuse kontekst.
  • Anduri tüüp, mida soovite jälgida.
  • Kiirus, millega andur peaks uusi andmeid saatma. Kõrgem tariif annab teie rakendusele rohkem andmeid, kuid see kasutab ka rohkem süsteemiressursse, eriti aku tööaega. Seadme aku säästmiseks peaksite taotlema minimaalset andmemahtu, mida teie rakendus nõuab. Kavatsen kasutada seadet SensorManager.SENSOR_DELAY_NORMAL, mis saadab uusi andmeid kord 200 000 mikrosekundi (0,2 sekundi) jooksul.

Kuna anduri kuulamine tühjendab seadme akut, ei tohiks te kunagi kuulajaid oma rakenduses onCreate () meetodis registreerida, kuna see põhjustab anduritel andmete saatmise jätkamist ka siis, kui teie rakendus on taustal.

Selle asemel peaksite andurid registreerima rakenduse onStart () elutsükli meetodil:

@Kaitseb kaitstud tühisuse onStart () {super.onStart (); // Kui andur on praeguses seadmes saadaval ... // if (lightSensor! = Null) {//…. Siis alustage kuulamist // lightSensorManager.registerListener (see, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Rakendage SensorEventListeneri tagasihelistamine

SensorEventListener on liides, mis võtab vastu teateid SensorManagerilt
kui uued andmed on saadaval või kui sensori täpsus muutub.

Esimene samm on meie klassi allkirja muutmine, et rakendada SensorEventListeneri liides:

avaliku klassi MainActivity laiendab AppCompatActivity rakendusi SensorEventListener {

Seejärel peame rakendama järgmised tagasihelistamise meetodid:

onSensorChanged ()

Seda meetodit kutsutakse vastuseks igale uuele SensorEvent.

Andurite andmed võivad sageli kiiresti muutuda, nii et teie rakendus võib korrapäraselt helistada meetodile onSensorChanged (). Rakenduse sujuva töö tagamiseks peaksite onSensorChanged () meetodi sees tegema võimalikult vähe tööd.

@Subjektiivsuse tühistamine saidilSensorChanged (SensorEvent sensorEvent) {// To do //}

onAccrityChanged ()

Kui sensori täpsus paraneb või väheneb, siis kutsub Android meetodit onAcc precizChanged () ja edastab selle sensori objektile, mis sisaldab uut täpsusväärtust, näiteks SENSOR_STATUS_UNRELIABLE või SENSOR_STATUS_ACCURACY_HIGH.

Valgussensor ei teata täpsuse muutustest, seega jätan onAcc pontChanged () tagasihelistamise tühjaks:

@Anna avaliku tühisuse onAcc pontChanged (anduri andur, int i) {// To do //}}

6. Hankige anduri väärtus

Kui meil on uus väärtus, peame helistama meetodile onSensorChanged () ja hankima stringi “light_sensor”. Seejärel võime tühistada stringi kohatäite teksti (% 1 $ .2f) ja kuvada värskendatud stringi meie TextView osana:

@Annab avaliku void onSensorChanged (SensorEvent sensorEvent) {// Anduri praegune väärtus // float currentValue = sensorEvent.values; // Tooge string “light_sensor”, sisestage uus väärtus ja kuvage see kasutajale // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Tühista oma kuulajate registreerimine

Andurid suudavad väikese aja jooksul genereerida suures koguses andmeid, nii et seadme ressursside säilitamiseks peate oma kuulajad registreerima, kui neid enam ei vajata.

Anduri sündmuste kuulamise lõpetamiseks, kui teie rakendus on taustal, lisage irregisterListener () oma projekti elutsükli meetodile onStop ():

@ Ületa kaitstud tühjus onStop () {super.onStop (); lightSensorManager.unregisterListener (see); }

Pidage meeles, et te ei tohiks kuulajate registreerimist saidil onPause () tühistada, kuna Android 7.0 või uuemad rakendused võivad töötada jagatud ekraaniga ja pilt-pildis režiimis, kus nad on peatatud olekus, kuid jäävad ekraanil nähtavaks.

Androidi valguseandurite kasutamine: valmis kood

Pärast kõigi ülaltoodud toimingute tegemist peaks projekti MainActivity välja nägema umbes selline:

impordi android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; impordi android.widget.TextView; avalik klass MainActivity laiendab AppCompatActivity // rakendab liidese SensorEventListener // rakendab SensorEventListener {// looge oma muutujad // private Sensor lightSensor; privaatne SensorManager lightSensorManager; privaatne TextView lightTextView; @Kuivata kaitstud tühine onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Hankige SensorManageri eksemplar // lightSensorManager = ((SensorManager) getSystemService (Context.SENSOR_SERVICE); // Kontrollige valgussensorit // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Kui valgussensorit pole, siis kuvage tõrge // String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Arvesta kaitstud tühjus onStart () {super.onStart (); // Kui andur on praeguses seadmes saadaval ... // if (lightSensor! = Null) {//… .registreerige siis kuulaja // lightSensorManager.registerListener (see, lightSensor, // Täpsustage, kui sageli soovite saada uusi andmeid // SensorManager.SENSOR_DELAY_NORMAL); }} @Sõida kaitstud tühine onStop () {super.onStop (); // Tühista oma kuulaja registreerimine // lightSensorManager.unregisterListener (see); } @Subista avalik void onSensorChanged (SensorEvent sensorEvent) {// Anduri praegune väärtus // float currentValue = sensorEvent.values; // Hankige string “light_sensor”, sisestage uus väärtus ja värskendage tekstiView // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @ Ülesanne // Kui anduri täpsus muutub ... .// public void onAcc pontChanged (Sensori andur, int i) {// TO DO //}}

Testige oma valmis Androidi sensorirakendust

Selle rakenduse testimiseks füüsilises Androidi nutitelefonis või tahvelarvutis:

  • Installige projekt oma seadmesse (valides Android Studio tööriistaribalt „Run> Run“).
  • Ehkki see erineb seadmetes, asub valgusandur sageli ekraani paremas ülanurgas. Valgustasemega manipuleerimiseks liigutage oma seadet valgusallikale lähemale ja seejärel sellest kaugemale. Valguse blokeerimiseks võite proovida seadet käega katta. Väärtus “Valgussensor” peaks suurenema ja vähenema, sõltuvalt saadaoleva valguse hulgast.

Kui kasutate Androidi virtuaalset seadet (AVD), on emulaatoril virtuaalsete andurite juhtelementide komplekt, mida saate kasutada mitmesuguste anduri sündmuste simuleerimiseks. Nendele virtuaalsete andurite juhtelementidele pääsete juurde emulaatori akna „Laiendatud juhtnupud” kaudu:

  • Installige rakendus oma AVD-le.
  • AVD kõrval näete ka nuppe. Leidke kolme punktiga nupp “Veel” (kus kursor paikneb järgmises ekraanipildis) ja klõpsake sellel nuppu. See avab akna „Laiendatud juhtnupud”.

  • Valige vasakpoolses menüüs „Virtuaalsed andurid”.
  • Valige vahekaart „Täiendavad andurid”. Sellel vahekaardil on erinevad liugurid, mida saate kasutada erinevate asukoha- ja keskkonnaandurite sündmuste simuleerimiseks.

  • Leidke liugur „Valgus (luks)” ja lohistage seda vasakule ja paremale, et simuleeritud valgustasemeid muuta. Teie rakendus peaks neid muutuvaid väärtusi kuvama reaalajas.

Valmis projekti saate alla laadida GitHubist.

Kauguse mõõtmine Androidi lähedussensoritega

Nüüd oleme näinud, kuidas keskkonnaandurilt teavet hankida, vaatame, kuidas saaksite neid teadmisi positsioon andur.

Selles jaotises kasutame nutitelefoni või tahvelarvuti ja muude objektide vahelise kauguse jälgimiseks seadme lähedusandurit. Kui teie rakendusel on mingisugune häälfunktsioon, võib lähedussensor aidata teil kindlaks teha, millal nutitelefoni kasutaja kõrva juurde hoitakse, näiteks kui telefonivestlus toimub. Seejärel saate seda teavet kasutada puuteürituste keelamiseks, nii et kasutaja ei riputa vestluse ajal kogemata telefoni üles ega käivita muid soovimatuid sündmusi.

Kasutajaliidese loomine

Kavatsen kuvada ekraanil läheduse andmeid, nii et saate neid värskendada reaalajas. Asjade lihtsamaks muutmiseks kasutame suure osa meie eelmise rakenduse paigutusest:

Järgmisena avage fail strings.xml ja looge string „proximity_sensor”. Jällegi peab see string sisaldama kohatäidet, mille lõpuks täidavad lähedussensorist eraldatud andmed:

Lähedussensor Lähedussensor:% 1 $ .2f Lähedusandurit pole saadaval

Andmete hankimine lähedusandurilt

Sarnaselt valguseandurile tagastab Androidi lähedussensor ühe andmeväärtuse, mis tähendab, et saame suure osa meie eelmise rakenduse koodist uuesti kasutada. Siiski on mõned suured erinevused, lisaks mõned nimega seotud muudatused, mis muudavad selle koodi hõlpsamaks jälgimiseks:

  • Looge SensorManageri eksemplar, mida seekord nimetan proximitySensorManager.
  • Hankige proximitySensorManageri eksemplar.
  • Looge viide „proximityTextView”.
  • Helistage meetodile getDefaultSensor () ja andke see TYPE_PROXIMITY andurile.
  • Registreerige läheduse anduri jaoks kuulajad ja registreerige need.

Pärast nende näpunäidete tegemist peaksite tegema järgmist:

impordi android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.hardware.SensorEventListener; impordi android.widget.TextView; avalik klass MainActivity laiendab AppCompatActivity // rakendab liidese SensorEventListener // rakendab SensorEventListener {// looge oma muutujad // private Sensor proximitySensor; privaatne SensorManager proximitySensorManager; privaatne TextView lähedusTextView; @Kuivata kaitstud tühine onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); proximityTextView = (TextView) findViewById (R.id.proximityTextView); // Hankige SensorManageri eksemplar // proximitySensorManager = ((SensorManager) getSystemService (Context.SENSOR_SERVICE); // Otsige lähedussensorit // proximitySensor = proximitySensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Kui lähedussensorit pole, siis kuvage tõrge // String sensor_error = getResources (). GetString (R.string.no_sensor); if (proximitySensor == null) {proximityTextView.setText (sensor_error); }} @Arvesta kaitstud tühjus onStart () {super.onStart (); // Kui andur on praeguses seadmes saadaval ... // if (proximitySensor! = Null) {//…. Siis registreerige kuulaja // proximitySensorManager.registerListener (see, proximitySensor, // Täpsustage, kui sageli soovite saada uusi andmeid // SensorManager.SENSOR_DELAY_NORMAL); }} @Sõida kaitstud tühine onStop () {super.onStop (); // Kui soovite süsteemiressursside säilitamiseks oma kuulaja registreerida, // proximitySensorManager.unregisterListener (this); } @Subista avalik void onSensorChanged (SensorEvent sensorEvent) {// Anduri praegune väärtus // float currentValue = sensorEvent.values; // Tooge string “proximity_sensor”, sisestage uus väärtus ja värskendage TextView // proximityTextView.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @Ülesta // Kui anduri täpsus muutub ... .// public void onAcc pontChanged (Sensori andur, int i) {//...TO DO //}}

Testimine: kui lähedal on kasutaja nende seadmele?

Selle rakenduse proovimiseks füüsilises Androidi nutitelefonis või tahvelarvutis installige rakendus oma seadmesse ja eksperimenteerige, liigutades kätt ekraani poole ja teisaldades selle uuesti. Väärtus “Lähedussensor” peaks teie liigutused registreerima.

Lihtsalt võtke arvesse, et lähedussensorid võivad seadmetes erineda. Mõnel seadmel võib kuvada ainult kaks läheduse väärtust - üks tähistab „lähedal“ ja teine ​​tähistab „kaugele“ - nii et ärge imestage, kui te ei näe oma füüsilises Android-seadmes palju erinevaid.

Selle rakenduse testimiseks emulaatoril toimige järgmiselt.

  • Installige rakendus AVD-le.
  • Leidke kolme punktiga nupp „Veel” ja klõpsake sellel nuppu „Laiendatud juhtnupud”.
  • Valige akna vasakpoolses menüüs „Virtuaalsed andurid”.
  • Valige vahekaart „Täiendavad andurid”.
  • Leidke liugur „Lähedus” ja lohistage seda vasakule ja paremale, et jäljendada objekti, mis liigub seadmele lähemale ja seejärel kaugemale. Läheduse anduri väärtused peaksid muutuma, kui liugurit manipuleerite.

Valmis projekti saate alla laadida GitHubist.

Liikumisandurid: mitmemõõtmeliste massiivide töötlemine

Kuni selle hetkeni oleme keskendunud anduritele, mis varustavad ühte andmeüksust, kuid on ka mõned andurid, mis pakuvad iga SensorEvent jaoks mitmemõõtmelisi massiive. Need mitmemõõtmelised andurid sisaldavad liikumisandureid, millele me selles viimases osas keskendume.

Liikumisandurid võivad teid aidata:

  • Esitage alternatiivne meetod kasutaja sisestamiseks. Näiteks kui arendate mobiilimängu, võib kasutaja oma seadet kallutades ekraanil ringi liikuda.
  • Alam kasutaja tegevus. Kui olete loonud tegevuse jälgimise rakenduse, saavad liikumisandurid aidata teil hinnata, kas kasutaja reisib autos, sörgib või istub oma laua taga.
  • Täpsemalt määrake orientatsioon.Seadme praegusest orientatsioonist võimalikult täpse ülevaate saamiseks on võimalik koordinaadid seadme liikumisanduritest eraldada ja need Maa koordinaatsüsteemi põhjal tõlkida.

Selles viimases osas kasutame rotatsioonivektoriandurit (TYPE_ROTATION_VECTOR). Erinevalt valguse ja läheduse anduritest on see tarkvaraandur, mis kogub andmeid seadme kiirendusmõõturi, magnetomeetri ja güroskoobi andurite kohta. Kuigi selle anduriga töötamine nõuab sageli matemaatiliste teisenduste ja teisenduste tegemist, võib see teile pakkuda ka mitmesugust ülitäpset teavet seadme kohta.

Loome rakenduse, mis kasutab rotatsioonivektoriandurit järgmiste mõõtmiseks:

  • Pigi. See on seadme ülalt alla kallutamine.
  • Veereta. See on seadme kaldenurk vasakult paremale.

Reaalajas pigi- ja rull-andmete kuvamine

Kuna mõõdame kahte mõõdikut, peame looma kaks tekstivaadet ja kaks vastavat stringi ressurssi:

Avage fail strings.xml ja lisage järgmine teave:

Liikumissensorid Pigi andur:% 1 $ .2f Veereandur:% 1 $ .2f Liikumisandurit pole saadaval

Pöördvektorianduri kasutamine oma rakenduses

Kasutame mõnda meie varasemate rakenduste koodi uuesti, nii et keskendume piirkondadele, kus pöörlemisvektorianduriga suhtlemine erineb oluliselt sellest, mida oleme varem näinud.

1. Kasutage TYPE_ROTATION_VECTOR

Kuna töötame rotatsioonivektorianduriga, peame helistama meetodile getDefaultSensor () ja andma sellele konstandi TYPE_ROTATION_VECTOR:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. Tõlgige anduri andmed

Erinevalt varasematest valgus- ja lähedussensoritest tagastavad liikumisandurid iga SensorEvent jaoks andurite väärtuste mitmemõõtmelisi massiive. Need väärtused vormindatakse, kasutades standardset “X, Y, Z” koordinaatsüsteemi, mis arvutatakse seadme suhtes, kui seda hoitakse vaikeasendis “loomulik”.

Android ei lülita neid X, Y ja Z koordinaate ümber, et need vastaksid seadme praegusele orientatsioonile, nii et X-telg jääb samaks sõltumata sellest, kas seade on püst- või horisontaalrežiimis. Pöördvektorianduri kasutamisel peate võib-olla teisendama sissetulevad andmed, et need vastaksid seadme praegusele pöörlemisele.

Portree on enamiku nutitelefonide vaikesuund, kuid te ei tohiks arvata, et see nii on kõik Androidi seadmed, eriti tahvelarvutid. Selles artiklis kasutame anduri andmete algsest tõlkimiseks pöörlemismaatriksit, seade koordinaatsüsteemi, kuni Maakera koordinaatsüsteem, mis tähistab seadme liikumist ja asukohta Maa suhtes. Vajaduse korral saame anduri andmeid seadme praeguse orientatsiooni põhjal ümber kujundada.

Esiteks on seadme koordinaatsüsteem standardne 3-teljeline X, Y, Z koordinaatsüsteem, kus iga kolme telje iga punkt on tähistatud 3D-vektoriga. See tähendab, et peame looma 9 ujuki väärtuse massiivi:

float rotationMatrix = uus ujuk;

Seejärel saame selle massiivi edastada meetodile getRotationMatrix ():

SensorManager.getRotationMatrixFromVector (rotatsioonimatrix, vektorid); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

Järgmine samm on meetodi SensorManager.remapCoordinateSystem () kasutamine anduri andmete ümbertegemiseks, lähtudes seadme praegusest orientatsioonist.

Meetod SensorManager.remapCoordinateSystem () kasutab järgmisi argumente:

  • Algne pöördemaatriks.
  • Teljed, mida soovite ümber kujundada.
  • Massiiv, mida te nende uute andmetega täidate.

Siin on kood, mida kasutan oma rakenduses:

ujukiga korrigeeritudRotationMatrix = uus ujuk; SensorManager.remapCoordinateSystem (rotatsioonMatrix, maailmAxisX, maailmAxisZ, korrigeeritudRotationMatrix);

Lõpuks helistame SensorManager.getOrientation ja palume tal kasutada kohandatudRotationMatrixit:

SensorManager.getOrientation (muudetudRotationMatrix, orientatsioon);

3. Uuendage kohatäidete stringe

Kuna meil on kaks andmekomplekti (samm ja rull), peame hankima kaks eraldi kohahoidja stringi, sisestama need õigete väärtustega ja seejärel värskendama vastavat TextView:

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

Mitme anduri andmete kuvamine: valmis kood

Pärast ülaltoodud toimingute tegemist peaks teie MainActivity välja nägema umbes selline:

import android.app.Activity; import android.os.Bundle; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; impordi android.widget.TextView; avalik klass MainActivity laiendab tegevust, rakendades SensorEventListener {private SensorManager motionSensorManager; privaatne Sensor motionSensor; privaatne TextView pitchTextView; privaatne TextView rollTextView; privaatne staatiline lõplik int SENSOR_DELAY = 500 * 1000; privaatne staatiline lõplik int FROM_RADS_TO_DEGS = -57; @Kuivata kaitstud tühine onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); proovige {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (see, motionSensor, SENSOR_DELAY); } saak (erand e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Orreide public void onAcc pontChanged (Sensori andur, int täpsus) {// To do //} @Orride public void onSensorChanged (SensorEvent event) {if (event.sensor == motionSensor) {update (event.values); }} privaatne tühine värskendus (ujukvektorid) {// Pööramismaatriksi arvutamine // float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector (rotatsioonimatrix, vektorid); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Maatriksi ümbermõõtmine vastavalt aktiivsuse praegusele orientatsioonile // float korrigeeritudRotationMatrix = uus float; SensorManager.remapCoordinateSystem (rotatsioonMatrix, maailmAxisX, maailmAxisZ, korrigeeritudRotationMatrix); // Arvutage seadme suund // ujuki suund = uus ujuk; // Lisage meetodile getOrientation () ujukiväärtuste massiivi // SensorManager.getOrientation (muudetudRotationMatrix, suund); ujuki samm = suund * FROM_RADS_TO_DEGS; ujukirull = suund * FROM_RADS_TO_DEGS; // Värskendage TextViewsi pigi ja rulli väärtustega // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Valmis projekti saate alla laadida GitHubist.

Testime meie viimast Androidi anduri rakendust

Selle rotatsioonivektoriga Androidi sensorirakenduse testimiseks füüsilises Androidi nutitelefonis või tahvelarvutis tehke järgmist.

  • Installige rakendus oma seadmesse.
  • Asetage nutitelefon või tahvelarvuti tasasele pinnale. Pange tähele, et liikumisandurid on äärmiselt tundlikud, nii et pole näiline, et liikumatult näiv seade teatab sammu ja rulli väärtuse kõikumisest.
  • Pigi testimiseks tõstke seadme põhi nii, et see kalduks teist eemale. Pigi väärtus peaks dramaatiliselt muutuma.
  • Rulli katsetamiseks proovige tõsta seadme vasakut külge, nii et see kaldub vasakule - jälgige, et rullväärtus oleks!

Kui katsetate oma projekti emulaatoril:

  • Installige rakendus oma AVD-le.
  • Valige „Veel”, mis avab akna „Laiendatud juhtnupud”.
  • Valige vasakpoolses menüüs „Virtuaalsed andurid”.
  • Veenduge, et vahekaart „Kiirendusmõõtur“ oleks valitud. See vahekaart sisaldab juhtelemente, mis võivad simuleerida seadme positsiooni ja suuna muutusi.
  • Proovige katsetada erinevaid liugureid (Pööramine: Z-Rot, X-Rot, Y-Rot; liigutage: X, Y ja Z) ja mitmesuguseid nuppe „Seadme pööramine”, et näha, kuidas need mõjutavad teie rakenduse „Rulliandurit” Ja “Pitch Sensor” väärtused.

Pakkimine üles

Selles artiklis nägime, kuidas saada andmeid Androidi andurite kolmest põhikategooriast: keskkond, asukoht ja liikumine ning kuidas neid andmeid reaalajas jälgida.

Kas olete näinud Androidi rakendusi, mis kasutavad andureid huvitaval või ainulaadsel viisil? Andke meile allolevates kommentaarides teada!

Kui oovite liikuda VR-i, on teil kak võimalut. Eimene on hankida ük paljudet aadaval olevatet nutitelefonidet või ieeivatet VR-peakomplektidet, mi teevad oma tööd uurepär...

Mobiiled levialad pole nii populaared kui vanati, kuid ühe omamiel on oma eelied võrrelde lihtalt nutitelefoni leviala funktiooni ielülitamiega. ...

Loe Täna