Master Android-anturit: laitteisto, ohjelmisto ja moniulotteinen

Kirjoittaja: John Stephens
Luomispäivä: 26 Tammikuu 2021
Päivityspäivä: 5 Heinäkuu 2024
Anonim
Master Android-anturit: laitteisto, ohjelmisto ja moniulotteinen - Sovellukset
Master Android-anturit: laitteisto, ohjelmisto ja moniulotteinen - Sovellukset

Sisältö


Nykyään useimmat nykyaikaiset Android-laitteet on varustettu joukolla antureita.

Voit käyttää näitä tietoja monilla eri tavoilla - valvooko se valon tasoa, jotta sovelluksesi voi säätää automaattisesti kirkkauttaan tai värimaailmaansa; annetaan käyttäjän olla vuorovaikutuksessa mobiilipelisi kanssa eleillä, kuten laitteen kallistamisella; tai läheisyysanturin avulla kosketustapahtumien automaattinen poistaminen käytöstä, kun käyttäjä pitää laitetta korvansa vieressä.

Tässä artikkelissa luomme kolme sovellusta, jotka noutavat valoa, läheisyyttä ja liiketietoja monenlaisista laitteisto- ja ohjelmistoantureista. Seuraamme myös näitä Android-antureita reaaliajassa, joten sovelluksessasi on aina pääsy viimeisimpiin tietoihin.

Tämän artikkelin loppuun mennessä tiedät, miten yksittäinen tieto voidaan purkaa Android-anturista ja miten käsitellä antureita, jotka tarjoavat tietojaan moniulotteisen taulukon muodossa.


Mitä Android-antureita voin käyttää?

Android-anturit voidaan jakaa seuraaviin luokkiin:

  • Ympäristöanturit. Nämä mittaavat ympäristöolosuhteita, kuten ilman lämpötila, paine, kosteus ja ympäristön valaistus.

  • Paikannusanturit. Tähän luokkaan kuuluvat anturit, jotka mittaavat laitteen fyysistä sijaintia, kuten läheisyysanturit ja geomagneettikenttäanturit.
    Liiketunnistimet. Nämä anturit mittaavat laitteen liikettä, ja sisältävät kiihtyvyysmittarit, painovoima-anturit, gyroskoopit ja pyörimisvektorianturit.

Lisäksi anturit voivat olla joko:

  • Laitteistopohjainen. Nämä ovat fyysisiä komponentteja, jotka on rakennettu laitteeseen ja mittaavat suoraan erityisiä ominaisuuksia, kuten kiihtyvyys tai ympäröivien geomagneettikentien voimakkuus.
  • Ohjelmistopohjaiset, joita kutsutaan joskus virtuaalisiksi antureiksi tai komposiittiantureiksi. Nämä tyypillisesti keräävät tietoja useista laitteistopohjaisista antureista. Kohti tämän artikkelin loppua, työskentelemme kiertovektorianturin kanssa, joka on ohjelmistoanturi, joka yhdistää laitteen kiihtyvyysmittarin, magnetometrin ja gyroskoopin tiedot.

Ympäristöanturit: Ympäristön valon mittaus

Androidin valoanturi mittaa ympäristön valoa ”lux” -yksiköinä, mikä on ihmisen silmän havaitsema valon voimakkuus. Anturin ilmoittama luksiarvo voi vaihdella laitteiden välillä, joten jos sovelluksesi vaatii yhdenmukaisia ​​arvoja, saatat joutua käsittelemään raakatietoja ennen kuin käytät sitä sovelluksessasi.


Tässä osassa aiomme luoda sovelluksen, joka hakee nykyisen lux-arvon laitteen valoanturilta, näyttää sen TextView-tiedostossa ja päivittää sitten TextView-kuvan, kun uutta tietoa tulee saataville.Tämän jälkeen voit käyttää näitä tietoja useissa sovelluksissa, esimerkiksi voit luoda taskulamppusovelluksen, joka vetää tietoja valoanturista ja säätää sen jälkeen säteen voimakkuuden automaattisesti nykyisten valotasojen perusteella.

Luo uusi Android-projekti valitsemasi asetuksilla ja aloitetaan!

Anturitietojen näyttäminen

Aion lisätä TextView-tiedoston, joka näyttää lopulta tiedot, jotka olemme poimaneet valoanturista. Tämä TextView päivitetään aina, kun uutta tietoa tulee saataville, joten käyttäjällä on aina pääsy uusimpiin tietoihin.

Avaa projektisi aktiviteetti_main.xml-tiedosto ja lisää seuraava:

Seuraavaksi meidän on luotava merkkijonoresurssi ”light_sensor”, johon viitataan asettelumme. Avaa projektisi strings.xml-tiedosto ja lisää seuraava:

Valoanturi:% 1 $ .2f

”% 1 $ .2f” on paikkamerkki, joka määrittää tiedot, jotka haluamme näyttää ja miten ne tulisi muotoilla:

  • %1. Voit lisätä useita paikkamerkkejä samaan merkkijonoresurssiin; ”% 1” tarkoittaa, että käytämme yhtä paikkamerkintää.
  • $.2. Tämä määrittelee, kuinka sovelluksemme tulee muotoilla jokainen saapuva liukuluku. ”$ .2” tarkoittaa, että arvo on pyöristettävä kahteen desimaalin tarkkuudella.
  • F. Alusta arvo liukulukuina.

Vaikka jotkut anturit ovat yleisempiä kuin toiset, sinun ei pitäisi koskaan olettaa, että jokaisella laitteella on pääsy täsmälleen samaan laitteistoon ja ohjelmistoon. Anturien saatavuus voi vaihdella jopa Android-version eri versioissa, koska jotkut anturit otettiin käyttöön vasta Android-alustan myöhemmissä julkaisuissa.

Voit tarkistaa, onko laitteessa tietty anturi, Android-anturikehyksen avulla. Voit sitten poistaa käytöstä tai ottaa käyttöön sovelluksesi osia anturien saatavuuden perusteella. Voit myös näyttää selityksen, että jotkin sovelluksesi ominaisuudet eivät toimi odotetulla tavalla.

Vaikka strings.xml-tiedostomme on auki, luodaan “no_sensor” -merkkijono, joka näytetään, jos valotunnistinta ei ole saatavana:

Valoanturia ei ole saatavana

Jos sovelluksesi ei pysty tarjoamaan hyvää käyttökokemusta ilman pääsyä tiettyyn anturiin, sinun on lisättävä nämä tiedot manifestiisi. Jos sovelluksesi vaatii esimerkiksi pääsyä kompassianturiin, voit käyttää seuraavaa:

Nyt sovelluksesi voidaan ladata vain laitteisiin, joissa on kompasianturi.

Vaikka tämä voi rajoittaa yleisöäsi, se on paljon vähemmän vahingollista kuin sen antaminen, että joku lataa sovelluksesi, kun hän on taattu saada huono kokemus laitteen anturimääritysten vuoksi.

Kommunikointi anturin kanssa: SensorManager, SensorEvents ja kuuntelijat

Jotta kommunikoit laitteen valoanturin kanssa, sinun on suoritettava seuraavat vaiheet:

1. Hanki SensorManager-esimerkki

SensorManager tarjoaa kaikki tarvitsemasi menetelmät laitteen kaikkien anturien käyttämiseksi.

Aloita luomalla muuttuja, joka sisältää SensorManager-ilmentymän:

yksityinen SensorManager lightSensorManager;

Sitten sinun on hankittava SensorManager-ilmentymä, soittamalla Context.getSystemService -menetelmään ja antamalla Context.SENSOR_SERVICE-argumentti:

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

2. Hanki viittaus lightTextView-ohjelmaan

Seuraavaksi meidän on luotava yksityinen jäsenmuuttuja, joka säilyttää TextView-objektimme, ja osoitettava se TextView-sovellukseemme:

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

3. Tarkista, onko anturi olemassa nykyisessä laitteessa

Voit päästä tiettyyn anturiin soittamalla getDefaultSensor () -menetelmään ja siirtämällä sen sitten kyseiselle anturille. Valoanturin tyyppivaki on TYPE_LIGHT, joten meidän on käytettävä seuraavaa:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Jos anturia ei ole tässä laitteessa, getDefaultSensor () -menetelmä palaa nollaksi, ja me näytetään merkkijono “no_sensor”:

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

4. Rekisteröi anturikuuntelijasi

Aina kun anturilla on uutta tietoa, Android luo SensorEvent-objektin. Tämä SensorEvent-objekti sisältää tapahtuman luoneet anturin, aikaleiman ja uuden data-arvon.

Aluksi keskitymme valo- ja läheisyysantureihin, jotka palauttavat yhden osan. Jotkut anturit tarjoavat kuitenkin moniulotteisia matriiseja jokaiselle SensorEvent-tapahtumalle, mukaan lukien rotaatiovektorianturi, jota tutkimme tämän artikkelin loppua kohti.

Varmistaaksesi, että sovelluksellemme ilmoitetaan näistä SensorEvent-objekteista, meidän on rekisteröitävä kuuntelija kyseiseen anturitapahtumaan käyttämällä SensorManager's registerListener () -sovellusta.

RegisterListener () -menetelmä ottaa seuraavat argumentit:

  • Sovellus tai toimintaympäristö.
  • Sen anturin tyyppi, jota haluat seurata.
  • Nopeus, jolla anturin tulisi lähettää uutta tietoa. Korkeampi hinta antaa sovelluksellesi enemmän tietoa, mutta se käyttää myös enemmän järjestelmäresursseja, etenkin akun käyttöikää. Laitteen akun säilyttämiseksi sinun tulee pyytää sovellukselta vaadittua vähimmäismäärää. Aion käyttää SensorManageria.SENSOR_DELAY_NORMAL, joka lähettää uutta tietoa kerran 200 000 mikrosekunnissa (0,2 sekunnissa).

Koska anturin kuuntelu tyhjentää laitteen akun, sinun ei pitäisi koskaan rekisteröidä kuulijoita sovelluksen onCreate () -menetelmään, koska anturit jatkavat tietojen lähettämistä, vaikka sovelluksesi olisi taustalla.

Sen sijaan sinun pitäisi rekisteröidä anturit sovelluksen onStart () -syklin menetelmällä:

@Suojattu tyhjä onStart () {super.onStart (); // Jos anturi on saatavana nykyisellä laitteella ... // if (lightSensor! = Nolla) {//…. Aloita sitten kuuntelu // lightSensorManager.registerListener (tämä, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Ota käyttöön SensorEventListener-takaisinsoitot

SensorEventListener on käyttöliittymä, joka vastaanottaa ilmoituksia SensorManagerilta
aina kun uutta tietoa on saatavana tai anturin tarkkuus muuttuu.

Ensimmäinen askel on luokan allekirjoituksemme muuttaminen SensorEventListener-käyttöliittymän toteuttamiseksi:

julkisen luokan MainActivity laajentaa AppCompatActivity -työkaluja SensorEventListener {

Meidän on sitten otettava käyttöön seuraavat soittopyynnöt:

onSensorChanged ()

Tätä menetelmää kutsutaan vasteena jokaiselle uudelle SensorEvent-tapahtumalle.

Anturitiedot voivat usein muuttua nopeasti, joten sovelluksesi voi soittaa säännöllisesti onSensorChanged () -menetelmään. Jotta sovelluksesi toimisi sujuvasti, sinun on suoritettava mahdollisimman vähän työtä onSensorChanged () -menetelmän sisällä.

@Yläkää julkinen tyhjä onSensorChanged (SensorEvent sensorEvent) {// Tehtävä //}

onAccuracyChanged ()

Jos anturin tarkkuus paranee tai heikkenee, Android kutsuu onAcc pontChanged () -menetelmää ja välittää sille anturiobjektin, joka sisältää uuden tarkkuusarvon, kuten SENSOR_STATUS_UNRELIABLE tai SENSOR_STATUS_ACCURACY_HIGH.

Valoanturi ei ilmoita tarkkuuden muutoksia, joten jätän onAcc pontChanged () -soittopyynnön tyhjäksi:

@Ylitä julkinen tyhjä onAcc pontChanged (anturianturi, int i) {// Tehtävä //}}

6. Hae anturin arvo

Aina kun meillä on uusi arvo, meidän on soitettava onSensorChanged () -menetelmälle ja haettava merkkijono “light_sensor”. Voimme sitten ohittaa merkkijonon paikkamerkkitekstin (% 1 $ .2f) ja näyttää päivitetyn merkkijonon osana TextView-ohjelmaa:

@On ohittaa julkinen tyhjä onSensorChanged (SensorEvent sensorEvent) {// Anturin nykyarvo // float currentValue = sensorEvent.values; // Hae ”light_sensor” -merkkijono, lisää uusi arvo ja näytä se käyttäjälle // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Poista kuuntelijoiden rekisteröinti

Anturit voivat tuottaa suuria määriä tietoja lyhyessä ajassa, joten laitteen resurssien säilyttämiseksi sinun on poistettava kuuntelijoiden rekisteröinti, kun heitä ei enää tarvita.

Jos haluat lopettaa anturitapahtumien kuuntelemisen, kun sovelluksesi on taustalla, lisää irregisterListener () projektin onStop () -syklin menetelmään:

@Suojattu tyhjä onStop () {super.onStop (); lightSensorManager.unregisterListener (tämä); }

Huomaa, että sinun ei pitäisi poistaa kuuntelijoiden rekisteröintiä onPause () -sovelluksessa, koska Android 7.0 tai uudempi sovellus voi toimia jaetun näytön ja kuvan kuvassa -tilassa, kun he ovat taukotilassa, mutta pysyvät näkyvissä näytöllä.

Androidin valoantureiden käyttäminen: valmis koodi

Kun olet suorittanut kaikki yllä olevat vaiheet, projektisi MainActivity-toiminnon tulisi näyttää tällaiselta:

tuo android.support.v7.app.AppCompatActivity; tuo android.os.Bundle; tuo android.content.Context; tuo android.hardware.Sensor; tuo android.hardware.SensorEvent; tuo android.hardware.SensorEventListener; tuo android.hardware.SensorManager; tuo android.widget.TextView; julkisen luokan MainActivity laajentaa AppCompatActivity // toteuttaa SensorEventListener-käyttöliittymä // toteuttaa SensorEventListener {// luoda muuttujat // yksityinen sensori lightSensor; yksityinen SensorManager lightSensorManager; yksityinen TextView lightTextView; @Ohota suojattu tyhjä onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Hanki SensorManager-esimerkki // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Tarkista valoanturi // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Jos valotunnistinta ei ole, niin näytä virhe // String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == nolla) {lightTextView.setText (sensor_error); }} @Orride suojattu tyhjä onStart () {super.onStart (); // Jos anturi on käytettävissä nykyisellä laitteella ... // if (lightSensor! = Null) {//….rekisteröi sitten kuuntelija // lightSensorManager.registerListener (tämä, lightSensor, // Määritä, kuinka usein haluat vastaanottaa uutta tietoa // SensorManager.SENSOR_DELAY_NORMAL); }} @Orride suojattu tyhjä onStop () {super.onStop (); // Poista kuuntelijan rekisteröinti // lightSensorManager.unregisterListener (this); } @Orride public void onSensorChanged (SensorEvent sensorEvent) {// Anturin nykyarvo // float currentValue = sensorEvent.values; // Hae ”light_sensor” -merkkijono, lisää uusi arvo ja päivitä TextView // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @Override // Jos anturin tarkkuus muuttuu ... .// julkinen tyhjä onAcc pontChanged (anturianturi, int i) {// TO DO //}}

Testaa valmis Android-sensori-sovelluksesi

Tämän sovelluksen testaaminen fyysisellä Android-älypuhelimella tai -tabletilla:

  • Asenna projekti laitteellesi (valitsemalla “Suorita> Suorita” Android Studio -työkaluriviltä).
  • Vaikka valoanturi vaihtelee laitteiden välillä, se sijaitsee usein näytön oikeassa yläkulmassa. Jos haluat käsitellä valotasoja, siirrä laite lähemmäksi ja sitten kauemmas valonlähteestä. Vaihtoehtoisesti voit yrittää peittää laitteen kädelläsi valon estämiseksi. ”Valoanturin” arvon tulisi nousta ja laskea käytettävissä olevan valon määrästä riippuen.

Jos käytät Android Virtual Device (AVD) -moduulia, emulaattorissa on joukko virtuaalisia anturiohjaimia, joita voit käyttää simuloimaan erilaisia ​​anturitapahtumia. Pääset käsiksi näihin virtuaalianturiohjaimiin emulaattorin laajennetun ohjauksen ikkunan kautta:

  • Asenna sovellus AVD: hen.
  • AVD: n vieressä näet painikkeen. Etsi kolmipisteinen Lisää-painike (missä kohdistin on seuraavassa kuvakaappauksessa) ja napsauta sitä. Tämä avaa ”Extended Controls” -ikkunan.

  • Valitse vasemmasta valikosta ”Virtuaalianturit”.
  • Valitse ”Lisäanturit” -välilehti. Tämä välilehti sisältää erilaisia ​​liukusäätimiä, joilla voit simuloida erilaisia ​​sijainti- ja ympäristöanturitapahtumia.

  • Etsi ”Valo (lux)” -liukusäädin ja vedä sitä vasemmalle ja oikealle, jotta voit muuttaa simuloituja valotasoja. Sovelluksesi tulisi näyttää nämä muuttuvat arvot reaaliajassa.

Voit ladata valmis projektin GitHubista.

Mittaa etäisyyttä Androidin läheisyysantureilla

Nyt olemme nähneet kuinka noutaa tietoja ympäristötunnistimelta. Katsotaanpa miten voisit soveltaa tätä tietoa asento sensori.

Käytämme tässä osiossa laitteen läheisyysanturia seurataksesi älypuhelimesi tai tablet-laitteen ja muiden esineiden välistä etäisyyttä. Jos sovelluksessasi on minkäänlaista äänitoimintoa, läheisyysanturi voi auttaa sinua määrittämään, milloin älypuhelinta pidetään käyttäjän korvalla, esimerkiksi kun hänellä on puhelinkeskustelu. Tämän jälkeen voit käyttää näitä tietoja kosketustapahtumien poistamiseen käytöstä, jotta käyttäjä ei vahingossa lopeta tai laukaise muita ei-toivottuja tapahtumia keskustelun keskellä.

Käyttöliittymän luominen

Aion näyttää läheisyystiedot ruudulla, joten voit seurata niiden päivitystä reaaliajassa. Käytämme uudelleen suurta osaa edellisen sovelluksemme asetteluista, jotta asiat pysyvät yksinkertaisina:

Avaa seuraavaksi strings.xml-tiedostosi ja luo ”proximity_sensor” -merkkijono. Jälleen kerran, tämän merkkijonon on sisällettävä paikkamerkki, jonka lopulta täyttää läheisyysanturista poimitut tiedot:

ProximitySensor Läheisyysanturi:% 1 $ .2f Läheisyysanturia ei ole saatavana

Tietojen hakeminen läheisyysanturilta

Samoin kuin valoanturi, myös Androidin läheisyysanturi palauttaa yhden data-arvon, mikä tarkoittaa, että voimme käyttää suurta osaa edellisen sovelluksemme koodista. On kuitenkin olemassa joitain suuria eroja sekä joitain nimiin liittyviä muutoksia, jotka helpottavat koodin seuraamista:

  • Luo SensorManager-ilmentymä, jota tällä kertaa kutsun nimeltä “proximitySensorManager”.
  • Hanki esimerkki ”proximitySensorManager” -sovelluksesta.
  • Luo viittaus proximityTextView-sovellukseen.
  • Soita getDefaultSensor () -menetelmälle ja välitä se TYPE_PROXIMITY-anturiin.
  • Rekisteröi ja poista kuulokkeet etäisyysanturille.

Kun olet tehnyt nämä parannukset, sinun pitäisi päätyä seuraavaan:

tuo android.support.v7.app.AppCompatActivity; tuo android.os.Bundle; tuo android.content.Context; tuo android.hardware.Sensor; tuo android.hardware.SensorEvent; tuo android.hardware.SensorManager; tuo android.hardware.SensorEventListener; tuo android.widget.TextView; julkinen luokka MainActivity laajentaa AppCompatActivity // toteuttaa SensorEventListener-käyttöliittymä // toteuttaa SensorEventListener {// Luo muuttujat // yksityinen Sensor proximitySensor; yksityinen SensorManager proximitySensorManager; yksityinen TextView-läheisyysTextView; @Ohota suojattu tyhjä onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); proximityTextView = (TextView) findViewById (R.id.proximityTextView); // Hanki SensorManager-esimerkki // proximitySensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Tarkista läheisyysanturi // proximitySensor = proximitySensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Jos etäisyysanturia ei ole, niin näytä virhe // String sensor_error = getResources (). GetString (R.string.no_sensor); if (proximitySensor == nolla) {proximityTextView.setText (sensor_error); }} @Orride suojattu tyhjä onStart () {super.onStart (); // Jos anturi on käytettävissä nykyisellä laitteella ... // if (proximitySensor! = Nolla) {//….rekisteröi sitten kuuntelija // proximitySensorManager.registerListener (tämä, proximitySensor, // Määritä, kuinka usein haluat vastaanottaa uutta tietoa // SensorManager.SENSOR_DELAY_NORMAL); }} @Orride suojattu tyhjä onStop () {super.onStop (); // Poista kuuntelijan rekisteröinti järjestelmän resurssien säilyttämiseksi // proximitySensorManager.unregisterListener (tämä); } @Orride public void onSensorChanged (SensorEvent sensorEvent) {// Anturin nykyarvo // float currentValue = sensorEvent.values; // Hae ”proximity_sensor” -merkkijono, lisää uusi arvo ja päivitä TextView // proximityTextView.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @Orvoi // Jos anturin tarkkuus muuttuu ... .// julkinen tyhjä onAcc pontChanged (Anturianturi, int i) {//...TO DO //}}

Testaus: Kuinka lähellä käyttäjää laite on?

Voit asettaa tämän sovelluksen testiksi fyysisellä Android-älypuhelimella tai -tabletilla asentamalla sovelluksen laitteellesi ja kokeilemalla sitten siirtämällä kättäsi kohti näyttöä ja siirtämällä sen sitten uudelleen. Lähestymisanturin arvon tulisi tallentaa liikkeet.

Huomaa vain, että läheisyysanturit voivat vaihdella laitteiden välillä. Jotkut laitteet saattavat näyttää vain kaksi läheisyysarvoa - toinen osoittaa “Lähellä” ja toinen osoittaa “Kaukana” - joten älä ihmettele, jos et näe paljon erilaisia ​​fyysisessä Android-laitteessasi.

Tämän sovelluksen testaaminen emulaattorissa:

  • Asenna sovellus AVD: lle.
  • Etsi kolmipisteinen "Lisää" -painike ja napsauta sitä, jolloin "Laajennetut ohjaimet" -ikkuna avataan.
  • Valitse ikkunan vasemmasta valikosta ”Virtuaalianturit”.
  • Valitse ”Lisäanturit” -välilehti.
  • Etsi Läheisyys-liukusäädin ja vedä sitä vasemmalle ja oikealle jäljitelläksesi objektia, joka siirtyy lähemmäksi laitetta ja sitten kauemmas. Läheisyysanturin arvojen tulisi muuttua, kun manipuloit liukusäädintä.

Voit ladata valmis projektin GitHubista.

Liiketunnistimet: Moniulotteisten ryhmien käsittely

Tähän saakka olemme keskittyneet antureihin, jotka toimittavat yhden tietoyksikön, mutta jotkut anturit tarjoavat moniulotteisia matriiseja jokaiselle SensorEvent-tapahtumalle. Nämä moniulotteiset anturit sisältävät liiketunnistimet, joihin keskitymme tässä viimeisessä osassa.

Liiketunnistimet voivat auttaa sinua:

  • Anna vaihtoehtoinen menetelmä käyttäjän syöttämiseen. Jos esimerkiksi kehität mobiilia peliä, käyttäjä saattaa siirtää hahmonsa näytön ympäri kallistamalla laitetta.
  • Alhainen käyttäjän toiminta. Jos olet luonut toiminnan seurantasovelluksen, liiketunnistimet voivat auttaa sinua arvioimaan, matkustaako käyttäjä autolla, lenkkeilee vai istuu pöydän ääressä.
  • Määritä tarkemmin suunta.On mahdollista poimia koordinaatit laitteen liiketunnistimista ja kääntää ne sitten maan koordinaattijärjestelmän perusteella, jotta saat tarkimman kuvan laitteen nykyisestä suunnasta.

Tässä viimeisessä osassa käytämme kiertovektorianturia (TYPE_ROTATION_VECTOR). Toisin kuin valo- ja läheisyysantureita, tämä on ohjelmistosensori, joka kokoaa tietoja laitteen kiihtyvyysanturista, magnetometristä ja gyroskoopin antureista. Vaikka tämän anturin kanssa työskenteleminen vaatii usein matemaattisten muuntamisten ja muunnoksien suorittamisen, se voi myös tarjota sinulle suuren määrän tarkkoja tietoja laitteesta.

Luomme sovelluksen, joka käyttää kiertovektorianturia mittaamaan:

  • Piki. Tämä on laitteen ylhäältä alas-kallistus.
  • Roll. Tämä on laitteen kallistus vasemmalta oikealle.

Näyttää reaaliaikaisen äänenkorkeuden ja rullatiedot

Koska mittaamme kahta mittareita, meidän on luotava kaksi TextView-kuvaa ja kaksi vastaavaa merkkijonoresurssia:

Avaa strings.xml-tiedosto ja lisää seuraava:

MotionSensors Pigi-anturi:% 1 $ .2f Vierintunnistin:% 1 $ .2f Liiketunnistinta ei ole saatavana

Kiertovektorianturin käyttäminen sovelluksessasi

Käytämme osaa aiempien sovellustemme koodista, joten keskitytään alueisiin, joilla kommunikointi pyörimisvektorianturin kanssa on huomattavasti erilainen kuin mitä olemme aiemmin nähneet.

1. Käytä TYPE_ROTATION_VECTOR

Koska työskentelemme kiertovektorianturin kanssa, meidän on soitettava getDefaultSensor () -menetelmälle ja välitettävä sille TYPE_ROTATION_VECTOR vakio:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. Käännä anturin tiedot

Toisin kuin aiemmat valo- ja läheisyysanturit, liiketunnistimet palauttavat moniulotteiset anturiarvoryhmät jokaiselle SensorEvent. Nämä arvot on muotoiltu käyttämällä standardia “X, Y, Z” koordinaattijärjestelmää, joka lasketaan suhteessa laitteeseen, kun sitä pidetään oletusasennossaan “luonnollinen”.

Android ei vaihda näitä X-, Y- ja Z-koordinaatteja ympäri vastaamaan laitteen nykyistä suuntausta, joten “X” -akseli pysyy samana riippumatta siitä, onko laite muotokuva- tai vaakatilassa. Kun käytät kiertovektorianturia, saatat joutua muuntamaan saapuvat tiedot vastaamaan laitteen nykyistä kiertoa.

Muotokuva on oletuksen mukainen suunta useimmille älypuhelimille, mutta sinun ei pitäisi olettaa, että näin on kaikki Android-laitteet, erityisesti tabletit. Tässä artikkelissa käytämme kiertomatriisia kääntämään anturin tiedot alkuperäisestä, laite koordinaatisto, Maan koordinaattijärjestelmä, joka edustaa laitteen liikettä ja sijaintia maan suhteen. Tarvittaessa voimme sitten muokata anturitiedot laitteen nykyisen suunnan perusteella.

Ensinnäkin laitekoordinaattijärjestelmä on standardi 3-akselinen X, Y, Z-koordinaatisto, jossa jokaisen kolmen akselin jokainen piste on esitetty 3D-vektorilla. Tämä tarkoittaa, että meidän on luotava joukko 9 kelluvuusarvoa:

float rotationMatrix = uusi kellua;

Voimme sitten siirtää tämän taulukon getRotationMatrix () -menetelmään:

SensorManager.getRotationMatrixFromVector (rotationMatrix, vektorit); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

Seuraava vaihe on SensorManager.remapCoordinateSystem () -menetelmän käyttäminen anturitietojen uudelleenmuokkaamiseen laitteen nykyisen suunnan perusteella.

SensorManager.remapCoordinateSystem () -menetelmä ottaa seuraavat argumentit:

  • Alkuperäinen kiertomatriisi.
  • Akselit, jotka haluat muokata.
  • Taajuusjoukko, jota täytät tällä uudella tiedolla.

Tässä on koodi, jota käytän sovelluksessani:

float sureRotationMatrix = uusi kellua; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, suretedRotationMatrix);

Viimeinkin, soitamme SensorManager.getOrientationille ja pyydämme sitä käyttämään muokattuaRotationMatrixia:

SensorManager.getOrientation (säädettyRotationMatrix, suunta);

3. Päivitä paikkamerkkijonot

Koska meillä on kaksi tietojoukkoa (sävelkorkeus ja rulla), meidän on haettava kaksi erillistä paikkamerkkijonoa, täytettävä ne oikeilla arvoilla ja päivitettävä vastaava TextView:

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

Useiden anturitietojen näyttäminen: Valmis koodi

Edellä olevien vaiheiden suorittamisen jälkeen MainActivity-laitteesi tulisi näyttää tällaiselta:

tuo android.app.Activity; tuo android.os.Bundle; tuo android.hardware.Sensor; tuo android.hardware.SensorEvent; tuo android.hardware.SensorEventListener; tuo android.hardware.SensorManager; tuo android.widget.TextView; julkinen luokka MainActivity laajentaa aktiviteettityökaluja SensorEventListener {yksityinen SensorManager motionSensorManager; yksityinen Sensor motionSensor; yksityinen TextView pitchTextView; yksityinen TextView rollTextView; yksityinen staattinen lopullinen int SENSOR_DELAY = 500 * 1000; yksityinen staattinen lopullinen int FROM_RADS_TO_DEGS = -57; @Ohota suojattu tyhjä onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); kokeile {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (tämä, motionSensor, SENSOR_DELAY); } saalis (poikkeus e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Orride public void onAcc pontChanged (Anturianturi, int tarkkuus) {// Tehtävä //} @Orride public void onSensorChanged (SensorEvent tapahtuma) {if (event.sensor == motionSensor) {update (event.values); }} yksityinen tyhjä päivitys (float-vektorit) {// Laske kiertomatriisi // float rotationMatrix = uusi kellua; SensorManager.getRotationMatrixFromVector (rotationMatrix, vektorit); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Suunnittele matriisi uudelleen aktiviteetin nykyisen suunnan perusteella // float sureRotationMatrix = uusi kellua; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, suretedRotationMatrix); // Laske laitteiden suunta // kelluvuuden suunta = uusi kellua; // Syötä kelluvien arvojen joukko getOrientation () -menetelmälle // SensorManager.getOrientation (korjattuRotationMatrix, suunta); kelluva sävelkorkeus = suunta * FROM_RADS_TO_DEGS; kelluva rulla = suunta * FROM_RADS_TO_DEGS; // Päivitä TextViews-sävelkorkeus ja rulla-arvot // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Voit ladata valmis projektin GitHubista.

Viimeisen Android-anturisovelluksemme testaaminen

Testaa tämä kiertovektorinen Android-anturisovellus fyysisellä Android-älypuhelimella tai -tabletilla:

  • Asenna sovellus laitteellesi.
  • Sijoita älypuhelin tai tabletti tasaiselle alustalle. Huomaa, että liiketunnistimet ovat erittäin herkkiä, joten ei ole epätavallista, että näennäisesti liikkumaton laite ilmoittaa nousun ja rullan arvojen vaihtelut.
  • Testaa äänenkorkeus nostamalla laitteen pohjaa niin, että se kallistuu poispäin. Äänenkorkeuden arvon tulisi muuttua dramaattisesti.
  • Testaa rullaa yrittämällä nostaa laitteen vasenta puolta, niin se kallistuu vasemmalle - pidä silmällä rullan arvo!

Jos testaat projektiasi emulaattorilla:

  • Asenna sovellus AVD: hen.
  • Valitse ”More”, joka avaa “Extended Controls” -ikkunan.
  • Valitse vasemmasta valikosta ”Virtuaalianturit”.
  • Varmista, että ”Kiihtyvyysanturi” -välilehti on valittu. Tämä välilehti sisältää säätimiä, jotka voivat simuloida muutoksia laitteen sijainnissa ja suunnassa.
  • Kokeile kokeilemalla erilaisia ​​liukusäätimiä (Kierrä: Z-Rot, X-Rot, Y-Rot; ja Siirrä: X, Y ja Z) ja erilaisia ​​“Device Rotation” -painikkeita nähdäksesi kuinka ne vaikuttavat sovelluksesi “Roll Sensor” -sovellukseen Ja Pitch Sensor -arvot.

Käärimistä

Tässä artikkelissa näimme, kuinka noutaa tietoja kolmesta Android-anturien pääryhmästä: ympäristö, sijainti ja liike sekä miten näitä tietoja voidaan seurata reaaliajassa.

Oletko nähnyt Android-sovelluksia, jotka käyttävät antureita mielenkiintoisilla tai ainutlaatuisilla tavoilla? Kerro meille alla olevissa kommenteissa!

Uui amung Galaxy 10 -arja merkitee yritykelle ueita enimmäiiä, yki tärkeimmitä enimmäiitä on yrityken uuden dynaamien AMOLED-näyttötekniikan eittely. Paneeli ta...

amana päivänä, kun amung julkaii uuimman erän lippulaiva-älypuhelimia - amung Galaxy 10 -arjan -, e avai myö kolme uutta amungin kokemukauppaa Yhdyvalloia....

Me Neuvomme