Pagrindiniai „Android“ jutikliai: aparatinė, programinė ir daugialypė

Autorius: John Stephens
Kūrybos Data: 26 Sausio Mėn 2021
Atnaujinimo Data: 5 Liepos Mėn 2024
Anonim
Connected sensors Apps workshop for HTHT minor
Video.: Connected sensors Apps workshop for HTHT minor

Turinys


Šiandien daugumoje šiuolaikinių „Android“ įrenginių yra daugybė jutiklių.

Šią informaciją galite naudoti įvairiais būdais - ar ji kontroliuoja apšvietimo lygius, kad jūsų programa galėtų automatiškai sureguliuoti ryškumą ar spalvų schemą; leidžia vartotojui sąveikauti su tavo mobiliuoju žaidimu, naudojant gestus, pvz., pakreipiant savo įrenginį; arba artumo jutiklio naudojimas automatiškai išjungti lietimo įvykius, kai vartotojas laiko savo prietaisą prie ausies.

Šiame straipsnyje mes sukursime tris programas, kurios nuskaitys šviesos, artumo ir judesio duomenis iš įvairių aparatūros ir programinės įrangos jutiklių. Šiuos „Android“ jutiklius taip pat stebėsime realiu laiku, todėl jūsų programa visada turės prieigą prie naujausios informacijos.

Šio straipsnio pabaigoje jūs žinosite, kaip iš „Android“ jutiklio išgauti vieną duomenų dalį ir kaip elgtis su jutikliais, kurie pateikia savo duomenis daugialypio masyvo pavidalu.

Kokius „Android“ jutiklius galiu naudoti?

„Android“ jutiklius galima suskirstyti į šias kategorijas:


  • Aplinkos jutikliai. Tai matuoja aplinkos sąlygas, tokias kaip oro temperatūra, slėgis, drėgmė ir aplinkos šviesos lygis.

  • Padėties jutikliai. Šiai kategorijai priklauso jutikliai, matuojantys įrenginio fizinę padėtį, tokie kaip artumo jutikliai ir geomagnetinio lauko jutikliai.
    Judesio jutikliai. Šie jutikliai matuoja prietaiso judesius ir apima pagreičio matuoklius, gravitacijos jutiklius, giroskopus ir sukimosi vektorių jutiklius.

Be to, jutikliai gali būti:

  • Aparatinės įrangos pagrindu. Tai yra fiziniai komponentai, įmontuoti į prietaisą ir tiesiogiai matuojantys specifines savybes, tokias kaip pagreitis ar aplinkinių geomagnetinių laukų stipris.
  • Programinės įrangos pagrindu, kartais žinomu kaip virtualūs jutikliai arba sudėtiniai jutikliai. Paprastai jie kaupia duomenis iš kelių aparatūros jutiklių. Šio straipsnio pabaigoje mes dirbsime su sukimosi vektoriaus jutikliu, kuris yra programinės įrangos jutiklis, jungiantis duomenis iš įrenginio pagreičio, magnetometro ir giroskopo.

Aplinkos jutikliai: aplinkos šviesos matavimas

„Android“ šviesos jutiklis matuoja aplinkos šviesą „liuksais“, o tai yra žmogaus akies suvokiamas šviesos intensyvumas. Jutiklio nurodoma liukso vertė gali skirtis įvairiuose įrenginiuose, taigi, jei jūsų programai reikia pastovių verčių, gali reikėti manipuliuoti neapdorotais duomenimis prieš juos naudojant savo programoje.


Šiame skyriuje mes sukursime programą, kuri nuskaitys esamą liukso vertę iš įrenginio šviesos jutiklio, rodys ją „TextView“ ir atnaujins „TextView“, kai tik bus naujų duomenų.Tada galite naudoti šią informaciją įvairiose programose, pavyzdžiui, galite sukurti degiklio programą, kuri ištrauks informaciją iš šviesos jutiklio ir automatiškai pakoreguos jo spindulio stiprumą pagal esamą apšvietimo lygį.

Sukurkite naują „Android“ projektą pasirinktais nustatymais ir pradėkime!

Jutiklio duomenų rodymas

Aš pridėsiu „TextView“, kuris galiausiai parodys duomenis, kuriuos mes išgavome iš šviesos jutiklio. Šis „TextView“ bus atnaujintas, kai tik bus naujų duomenų, todėl vartotojas visada turės prieigą prie naujausios informacijos.

Atidarykite projekto „activity_main.xml“ failą ir pridėkite:

Kitas, mes turime sukurti „light_sensor“ eilutės išteklius, nurodytus mūsų makete. Atidarykite projekto „strings.xml“ failą ir pridėkite:

Šviesos jutiklis:% 1 $ .2f

„% 1 $ .2f“ yra vietos rezervuaras, nurodantis informaciją, kurią norime rodyti, ir kaip ją formatuoti:

  • %1. Į tą patį eilutės šaltinį galite įterpti kelis vietos rezervuarus; „% 1“ rodo, kad mes naudojame vieną vietos rezervuarą.
  • $.2. Tai nurodo, kaip mūsų programa turėtų suformatuoti kiekvieną gaunamą slankiojo kablelio vertę. „$ .2“ reiškia, kad vertė turėtų būti suapvalinta iki dviejų skaičių po kablelio.
  • F. Formatuokite vertę kaip slankiojo kablelio skaičių.

Nors kai kurie jutikliai yra dažnesni nei kiti, niekada neturėtumėte manyti, kad kiekvienas įrenginys turi prieigą prie tos pačios aparatinės ir programinės įrangos. Jutiklių pasiekiamumas net gali skirtis skirtingose ​​„Android“ versijose, nes kai kurie jutikliai nebuvo įdiegti iki vėlesnių „Android“ platformos išleidimų.

Naudodami „Android“ jutiklių sistemą galite patikrinti, ar įrenginyje nėra tam tikro jutiklio. Tada galite neleisti arba įjungti programos dalių, remdamiesi jutiklių prieinamumu, arba galite parodyti paaiškinimą, kad kai kurios programos funkcijos neveiks taip, kaip tikėtasi.

Kol mūsų strings.xml failas yra atidarytas, sukurkime „no_sensor“ eilutę, kuri bus rodoma, jei šviesos jutiklis negalimas:

Nėra šviesos jutiklio

Jei jūsų programa negali suteikti geros vartotojo patirties neturėdami prieigos prie tam tikro jutiklio, turite šią informaciją įtraukti į savo manifestą. Pvz., Jei jūsų programai reikalinga prieiga prie kompaso jutiklio, galite naudoti šiuos veiksmus:

Dabar jūsų programą galima atsisiųsti tik į įrenginius, kuriuose yra kompaso jutiklis.

Nors tai gali apriboti jūsų auditoriją, tai daro daug mažiau žalos, nei leisti kam nors atsisiųsti jūsų programą, kai jie patys garantuojama dėl jų įrenginio jutiklio konfigūracijos turėti blogą patirtį.

Bendravimas su jutikliu: „SensorManager“, „SensorEvents“ ir klausytojais

Norėdami susisiekti su įrenginio šviesos jutikliu, turite atlikti šiuos veiksmus:

1. Gaukite „SensorManager“ egzempliorių

„SensorManager“ pateikia visus metodus, kurių reikia norint pasiekti visą prietaiso jutiklių diapazoną.

Norėdami pradėti, sukurkite kintamąjį, kuriame bus „SensorManager“ egzempliorius:

„private SensorManager“ „lightSensorManager“;

Tada turite gauti „SensorManager“ egzempliorių, paskambinę Context.getSystemService metodu ir įvesdami Context.SENSOR_SERVICE argumentą:

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

2. Gaukite nuorodą į „lightTextView“

Toliau turime sukurti privatų nario kintamąjį, kuriame bus mūsų „TextView“ objektai, ir priskirti jį „TextView“:

privatus „TextView“ „lightTextView“; ... ... ... lightTextView = („TextView“) rastiViewById (R.id.lightTextView);

3. Patikrinkite, ar jutiklis yra dabartiniame įrenginyje

Galite pasiekti prieigą prie tam tikro jutiklio paskambinę metodu „getDefaultSensor ()“ ir perduodami jam atitinkamą jutiklį. Šviesos jutiklio tipo konstanta yra TYPE_LIGHT, todėl turime naudoti šiuos dalykus:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Jei jutiklio šiame įrenginyje nėra, tada metodas getDefaultSensor () grįš negaliojantis ir parodysime eilutę „no_sensor“:

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

4. Užregistruokite savo jutiklių klausytojus

Kiekvieną kartą, kai jutiklis turi naujų duomenų, „Android“ sugeneruoja „SensorEvent“ objektą. Šis „SensorEvent“ objektas apima įvykį sukūrusį jutiklį, laiko žymeklį ir naują duomenų vertę.

Iš pradžių daugiausia dėmesio skirsime šviesos ir artumo jutikliams, kurie grąžina vieną duomenų dalį. Tačiau kai kurie jutikliai pateikia daugialypius kiekvieno „SensorEvent“ masyvus, įskaitant sukimosi vektoriaus jutiklį, kurį nagrinėsime šio straipsnio pabaigoje.

Norėdami užtikrinti, kad mūsų programai būtų pranešama apie šiuos „SensorEvent“ objektus, turime užregistruoti klausytoją tam konkrečiam jutiklio įvykiui, naudodami „SensorManager“ registreListener ().

Metodas registerListener () atsižvelgia į šiuos argumentus:

  • Programos ar veiklos kontekstas.
  • Jutiklio tipas, kurį norite stebėti.
  • Greitis, kuriuo jutiklis turėtų siųsti naujus duomenis. Didesnis tarifas suteiks jūsų programai daugiau duomenų, tačiau ji taip pat sunaudos daugiau sistemos išteklių, ypač baterijos. Norėdami padėti išsaugoti įrenginio akumuliatorių, turėtumėte paprašyti minimalaus duomenų kiekio, kurio reikia jūsų programai. Aš ketinu naudoti „SensorManager.SENSOR_DELAY_NORMAL“, kuris siunčia naujus duomenis kartą per 200 000 mikrosekundžių (0,2 sekundės).

Kadangi klausydamiesi jutiklio išeikvojate įrenginio akumuliatorius, niekada neturėtumėte registruoti klausytojų naudodami programos „onCreate ()“ metodą, nes jutikliai toliau siųs duomenis, net kai jūsų programa yra fone.

Vietoje to, turėtumėte užregistruoti jutiklius naudodami programos „onStart ()“ būvio ciklo metodą:

@Atšaukti apsaugotą tuštumą onStart () {super.onStart (); // Jei jutiklis galimas dabartiniame įrenginyje ... // if (lightSensor! = Null) {//…. Tada pradėkite klausytis // lightSensorManager.registerListener (this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Įdiekite „SensorEventListener“ atšaukimus

„SensorEventListener“ yra sąsaja, kuri gauna pranešimus iš „SensorManager“
kai tik yra naujų duomenų arba keičiasi jutiklio tikslumas.

Pirmasis žingsnis yra modifikuoti mūsų klasės parašą, kad būtų įdiegta „SensorEventListener“ sąsaja:

viešosios klasės „MainActivity“ išplečia „AppCompatActivity“ įgyvendina „SensorEventListener“ {

Tada turime įdiegti šiuos atgalinio ryšio metodus:

onSensorChanged ()

Šis metodas vadinamas reaguojant į kiekvieną naują „SensorEvent“.

Jutiklio duomenys dažnai gali greitai pasikeisti, todėl jūsų programa gali reguliariai skambinti onSensorChanged () metodu. Kad programa veiktų sklandžiai, „onSensorChanged“ () metodu turėtumėte atlikti kuo mažiau darbų.

@Atšaukti viešą negaliojimą „onSensorChanged“ („SensorEvent sensorEvent“) {// To do //}

onAcc pontChanged ()

Jei jutiklio tikslumas pagerėja arba sumažėja, „Android“ iškviečia metodą „onAcc pontChanged ()“ ir perduoda jį jutiklio objektui, kuriame yra nauja tikslumo vertė, pvz., SENSOR_STATUS_UNRELIABLE arba SENSOR_STATUS_ACCURACY_HIGH.

Šviesos jutiklis nepraneša apie tikslumo pokyčius, todėl „onAcc preciziškumo“ () atgalinį skambutį paliksiu tuščią:

@Atšaukti viešą negaliojimą „onAcc pontChanged“ (jutiklio jutiklis, int i) {// To do //}}

6. Gaukite jutiklio vertę

Kai tik turime naują vertę, turime paskambinti onSensorChanged () metodu ir nuskaityti eilutę „light_sensor“. Tada galime nepaisyti eilutės vietos žymeklio teksto (% 1 $ .2f) ir parodyti atnaujintą eilutę kaip „TextView“ dalį:

@Atšaukti viešą tuštumą onSensorChanged (SensorEvent sensorEvent) {// Daviklio dabartinė vertė // float currentValue = sensorEvent.values; // Gauti eilutę „light_sensor“, įterpti naują reikšmę ir parodyti ją vartotojui // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Išregistruokite savo klausytojus

Jutikliai gali generuoti didelius duomenų kiekius per trumpą laiką, todėl norėdami išsaugoti įrenginio išteklius, turėsite išregistruoti savo klausytojus, kai jų nebereikės.

Jei norite nustoti klausytis jutiklių įvykių, kai jūsų programa yra fone, pridėkite neregisterListener () prie savo projekto „onStop ()“ ciklo metodo:

@Atšaukti apsaugotą tuštumą onStop () {super.onStop (); „lightSensorManager.unregisterListener“ (tai); }

Atminkite, kad neturėtumėte išregistruoti savo klausytojų „onPause“ (), nes „Android 7.0“ ir naujesnės versijos programos gali veikti padalijamo ekrano ir vaizdo „vaizdas paveikslėlyje“ režimu, kai jų būsena yra pristabdyta, tačiau jie lieka matomi ekrane.

„Android“ šviesos jutiklių naudojimas: užpildytas kodas

Atlikus visus aukščiau aprašytus veiksmus, projekto „MainActivity“ turėtų atrodyti taip:

importuoti „android.support.v7.app.AppCompatActivity“; importuoti android.os.Bundle; importuoti android.content.Context; importuoti android.hardware.Sensor; importuoti „android.hardware.SensorEvent“; importuoti „android.hardware.SensorEventListener“; importuoti „android.hardware.SensorManager“; importuoti „android.widget.TextView“; viešosios klasės „MainActivity“ išplečia „AppCompatActivity“ // Įdiekite „SensorEventListener“ sąsają // Įveskite „SensorEventListener“ {// Sukurkite savo kintamuosius // Privatus jutiklis „lightSensor“; „private SensorManager“ „lightSensorManager“; privatus „TextView“ „lightTextView“; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); „lightTextView“ ((„TextView“) „findViewById“ (R.id.lightTextView); // Gaukite „SensorManager“ egzempliorių // „lightSensorManager =“ („SensorManager“) getSystemService („Context.SENSOR_SERVICE“); // Patikrinkite, ar nėra šviesos jutiklio // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Jei šviesos jutiklio nėra, tada parodykite klaidą // Styginių jutiklis_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Atšaukti apsaugotą tuštumą onStart () {super.onStart (); // Jei jutiklis galimas dabartiniame įrenginyje ... // if (lightSensor! = Null) {//… .tad registruokite klausytoją // lightSensorManager.registerListener (this, lightSensor, // Nurodykite, kaip dažnai norite priimti naujus duomenis // SensorManager.SENSOR_DELAY_NORMAL); }} @Atšaukti apsaugotą tuštumą onStop () {super.onStop (); // Išregistruokite savo klausytoją // lightSensorManager.unregisterListener (this); } @Atšaukti viešą tuštumą onSensorChanged (SensorEvent sensorEvent) {// Daviklio dabartinė vertė // float currentValue = sensorEvent.values; // Gaukite „light_sensor“ eilutę, įdėkite naują reikšmę ir atnaujinkite „TextView“ // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @Atšaukti // Jei jutiklio tikslumas pasikeičia ... .// „public void“ onAcc pontChanged (Jutiklio jutiklis, int i) {// TO DO //}}

Išbandykite užpildytą „Android“ jutiklių programą

Norėdami išbandyti šią programą fiziniame „Android“ išmaniajame telefone ar planšetiniame kompiuteryje:

  • Įdiekite projektą savo įrenginyje („Android Studio“ įrankių juostoje pasirinkdami „Vykdyti> Vykdyti“).
  • Šviesos jutiklis dažnai būna viršutinėje dešinėje ekrano dalyje, nors jis skiriasi. Norėdami manipuliuoti šviesos lygiais, judinkite savo prietaisą arčiau šviesos šaltinio, o toliau nuo jo. Arba galite pabandyti uždengti prietaisą ranka, kad užstotų šviesą. „Šviesos jutiklio“ vertė turėtų padidėti ir sumažėti, atsižvelgiant į esamą šviesos kiekį.

Jei naudojate „Android“ virtualųjį įrenginį (AVD), emuliatoriuje yra virtualaus jutiklio valdiklių rinkinys, kurį galite naudoti imituodami įvairius jutiklio įvykius. Šiuos virtualių jutiklių valdiklius galite pasiekti per emuliatoriaus langą „Išplėstiniai valdikliai“:

  • Įdiekite programą į savo AVD.
  • Šalia AVD pamatysite mygtukų juostelę. Suraskite trijų taškų mygtuką „Daugiau“ (kur žymeklis išdėstytas šioje ekrano kopijoje) ir spustelėkite jį. Atidaromas langas „Išplėstinis valdymas“.

  • Kairiajame meniu pasirinkite „Virtualūs jutikliai“.
  • Pasirinkite skirtuką „Papildomi jutikliai“. Šiame skirtuke yra įvairių skaidrių, kuriomis galite modeliuoti skirtingus padėties ir aplinkos jutiklių įvykius.

  • Raskite slankiklį „Šviesa (liuksas)“ ir vilkite jį į kairę ir į dešinę, kad pakeistumėte modeliuojamą šviesos lygį. Jūsų programa turėtų parodyti šias kintančias vertes realiuoju laiku.

Galite atsisiųsti baigtą projektą iš „GitHub“.

Matuojamas atstumas naudojant „Android“ artumo jutiklius

Dabar mes matėme, kaip gauti informaciją iš aplinkos jutiklio, pažiūrėkime, kaip šias žinias pritaikytumėte padėtis jutiklis.

Šiame skyriuje naudosime įrenginio artumo jutiklį, kad stebėtume atstumą tarp jūsų išmaniojo telefono ar planšetinio kompiuterio ir kitų objektų. Jei jūsų programoje yra kokių nors balso funkcijų, artumo jutiklis gali padėti nustatyti, kada išmanusis telefonas yra laikomas prie vartotojo ausies, pavyzdžiui, kai jie kalbasi telefonu. Tada galite naudoti šią informaciją norėdami išjungti lietimo įvykius, kad vartotojas neatsitiktinai neatsijungtų ir nesukeltų kitų nepageidaujamų įvykių pokalbio metu.

Vartotojo sąsajos kūrimas

Ekrane rodysiu artumo duomenis, kad galėtumėte stebėti, kaip jie atnaujinami realiu laiku. Pakartokime didelę ankstesnės programos išdėstymo dalį, kad viskas būtų paprasčiau:

Tada atidarykite failą strings.xml ir sukurkite „proximity_sensor“ eilutę. Vėlgi, šioje eilutėje turi būti vietos žymeklis, kurį ilgainiui užpildys duomenys, išgauti iš artumo jutiklio:

Artumo jutiklis Artumo jutiklis:% 1 $ .2f Artumo jutiklio nėra

Duomenų gavimas iš artumo jutiklio

Panašiai kaip šviesos jutiklį, „Android“ artumo jutiklis grąžina vieną duomenų vertę, tai reiškia, kad galime pakartotinai panaudoti didelę dalį ankstesnės programos kodo. Tačiau yra keletas pagrindinių skirtumų ir keletas su pavadinimu susijusių pakeitimų, kurie palengvina šio kodo laikymąsi:

  • Sukurkite „SensorManager“ egzempliorių, kurį šįkart pavadinsiu „proximitySensorManager“.
  • Gaukite „proximitySensorManager“ egzempliorių.
  • Sukurkite nuorodą į „proximityTextView“.
  • Paskambinkite metodu getDefaultSensor () ir perduokite jam TYPE_PROXIMITY jutiklį.
  • Užregistruokite ir išregistruokite artumo jutiklio klausytojus.

Atlikę šiuos patarimus, turėtumėte baigti šiuos dalykus:

importuoti „android.support.v7.app.AppCompatActivity“; importuoti android.os.Bundle; importuoti android.content.Context; importuoti android.hardware.Sensor; importuoti „android.hardware.SensorEvent“; importuoti „android.hardware.SensorManager“; importuoti „android.hardware.SensorEventListener“; importuoti „android.widget.TextView“; viešosios klasės „MainActivity“ išplečia „AppCompatActivity“ // Įdiekite „SensorEventListener“ sąsają // Įdiekite „SensorEventListener“ {// Sukurkite savo kintamuosius // Privatus „Sensor proximitySensor“; privatus „SensorManager“ proximitySensorManager; privatus „TextView“ artumasTextView; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); proximityTextView = („TextView“) rastiViewById (R.id.proximityTextView); // Gaukite „SensorManager“ egzempliorių // proximitySensorManager = („SensorManager“) getSystemService (Context.SENSOR_SERVICE); // Patikrinkite artumo jutiklį // proximitySensor = proximitySensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Jei artumo jutiklio nėra, tada parodykite klaidą // Styginių jutiklis_error = getResources (). GetString (R.string.no_sensor); if (proximitySensor == niekinis) {proximityTextView.setText (sensor_error); }} @Atšaukti apsaugotą tuštumą onStart () {super.onStart (); // Jei jutiklis galimas dabartiniame įrenginyje ... // if (proximitySensor! = Null) {//…. Tada užregistruokite klausytoją // proximitySensorManager.registerListener (this, proximitySensor, // Nurodykite, kaip dažnai norite priimti naujus duomenis // SensorManager.SENSOR_DELAY_NORMAL); }} @Atšaukti apsaugotą tuštumą onStop () {super.onStop (); // Išregistruokite savo klausytoją, kad išsaugotumėte sistemos išteklius // proximitySensorManager.unregisterListener (this); } @Atšaukti viešą tuštumą onSensorChanged (SensorEvent sensorEvent) {// Daviklio dabartinė vertė // float currentValue = sensorEvent.values; // Gaukite „proximity_sensor“ eilutę, įdėkite naują vertę ir atnaujinkite „TextView“ // proximityTextView.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @Atšaukti // Jei jutiklio tikslumas pasikeičia ... .// „public void“ onAcc pontChanged (Jutiklio jutiklis, int i) {//...TO DO //}}

Tikrinimas: kiek artimas vartotojas jų įrenginiui?

Norėdami išbandyti šią programą fiziniame „Android“ išmaniajame telefone ar planšetiniame kompiuteryje, įdiekite programą į savo įrenginį ir eksperimentuokite, judindami ranką ekrano link, o tada vėl atitraukdami. Vertė „Artumo jutiklis“ turėtų užregistruoti jūsų judesius.

Tiesiog žinokite, kad artumo jutikliai skirtinguose įrenginiuose gali skirtis. Kai kuriuose įrenginiuose gali būti rodomos tik dvi artumo vertės - viena žymi „Netoli“, o kita - „toli“ - todėl nenustebkite, jei fiziniame „Android“ įrenginyje nematote daug įvairių variantų.

Norėdami išbandyti šią programą emuliatoriuje:

  • Įdiekite savo programą į AVD.
  • Suraskite trijų taškų mygtuką „Daugiau“ ir paspauskite, tada atidaromas langas „Išplėstinis valdymas“.
  • Lango kairiajame meniu pasirinkite „Virtualūs jutikliai“.
  • Pasirinkite skirtuką „Papildomi jutikliai“.
  • Raskite slankiklį „Artumas“ ir vilkite jį į kairę ir dešinę, kad mėgdžiotumėte objektą, judantį arčiau įrenginio, o toliau. „Artumo jutiklio“ vertės turėtų pasikeisti, kai manipuliuojate slankikliu.

Galite atsisiųsti baigtą projektą iš „GitHub“.

Judesio jutikliai: Apdorojami daugialypiai masyvai

Iki šiol mes sutelkėme dėmesį į jutiklius, kurie tiekia vieną duomenų elementą, tačiau yra keletas jutiklių, teikiančių daugialypius masyvus kiekvienam „SensorEvent“. Šie daugialypiai jutikliai apima judesio jutiklius, kuriems mes skirsime dėmesį šiame paskutiniame skyriuje.

Judesio jutikliai gali jums padėti:

  • Pateikite alternatyvų vartotojo įvesties metodą. Pvz., Jei kuriate mobilųjį žaidimą, vartotojas gali perkelti savo personažą ekrane pakreipdamas savo įrenginį.
  • Nepakankama vartotojo veikla. Jei sukūrėte veiklos stebėjimo programą, judesio jutikliai gali padėti įvertinti, ar vartotojas keliauja automobiliu, bėgioja ar sėdi prie savo stalo.
  • Tiksliau nustatyti orientaciją.Norint gauti tiksliausią įžvalgą apie dabartinę įrenginio orientaciją, galima išgauti įrenginio judesio jutiklių koordinates ir jas išversti remiantis Žemės koordinačių sistema.

Šiame paskutiniame skyriuje naudosime sukimosi vektoriaus jutiklį (TYPE_ROTATION_VECTOR). Skirtingai nuo šviesos ir artumo jutiklių, tai yra programinės įrangos jutiklis, kuris kaupia duomenis iš įrenginio pagreičio, magnetometro ir giroskopo jutiklių. Nors dirbdami su šiuo jutikliu dažnai turite atlikti matematinius konvertavimus ir transformacijas, jis taip pat gali suteikti jums labai tikslios informacijos apie įrenginį.

Mes sukursime programą, kuri pasukimo vektoriaus jutiklį išmatuos:

  • Pikis. Tai yra įrenginio pakreipimas nuo viršaus į apačią.
  • Susukite. Tai yra įrenginio pasvirimas iš kairės į dešinę.

Rodo ir realiojo laiko duomenų apie ritinius pateikimas

Kadangi matuojame dvi metrikas, turime sukurti du „TextView“ ir du atitinkamus eilutės išteklius:

Atidarykite failą strings.xml ir pridėkite:

„MotionSensors“ Pikso daviklis:% 1 $ .2f Riedėjimo jutiklis:% 1 $ .2f Nėra judesio jutiklio

Sukimosi vektoriaus jutiklio naudojimas programoje

Mes pakartotinai panaudosime kai kuriuos ankstesnių programų kodus, todėl sutelkime dėmesį į sritis, kuriose bendraujame su sukimosi vektoriaus jutikliu, žymiai skirtis nuo to, ką matėme anksčiau.

1. Naudokite TYPE_ROTATION_VECTOR

Kadangi mes dirbame su sukimosi vektoriaus jutikliu, turime paskambinti metodu getDefaultSensor () ir perduoti jam TYPE_ROTATION_VECTOR konstantą:

positionSensorManager.getDefaultSensor (jutiklis.TYPE_ROTATION_VECTOR);

2. Išverskite jutiklio duomenis

Skirtingai nuo ankstesnių šviesos ir artumo jutiklių, judesio jutikliai grąžina daugialypius jutiklių verčių masyvus kiekvienam „SensorEvent“. Šios vertės yra suformatuotos naudojant standartinę „X, Y, Z“ koordinačių sistemą, kuri apskaičiuojama atsižvelgiant į įrenginį, kai jis laikomas numatytuoju „natūraliu“ orientyru.

„Android“ nekeičia šių X, Y ir Z koordinačių, kad atitiktų dabartinę įrenginio orientaciją, todėl „X“ ašis išliks ta pati, nepriklausomai nuo to, ar įrenginys veikia portreto, ar kraštovaizdžio režimu. Kai naudojate sukimosi vektoriaus jutiklį, gali tekti konvertuoti gaunamus duomenis, kad jie atitiktų dabartinę įrenginio sukimosi liniją.

Daugelyje išmaniųjų telefonų numatytoji orientacija yra portretas, tačiau nereikia manyti, kad taip bus visi „Android“ įrenginiai, ypač planšetiniai kompiuteriai. Šiame straipsnyje jutiklio duomenis iš originalo išversime naudosime pasukimo matricą, prietaisas koordinačių sistema, Žemės koordinačių sistema, kuri nurodo prietaiso judesį ir padėtį žemės atžvilgiu. Jei reikia, jutiklio duomenis galime perdaryti, remdamiesi dabartine įrenginio orientacija.

Pirma, prietaiso koordinačių sistema yra standartinė 3 ašių X, Y, Z koordinačių sistema, kur kiekvienas taškas kiekvienoje iš trijų ašių yra pavaizduotas 3D vektoriu. Tai reiškia, kad turime sukurti 9 slankiųjų vertybių masyvą:

float rotationMatrix = nauja plūdė;

Tada galime perduoti šį masyvą metodui getRotationMatrix ():

„SensorManager.getRotationMatrixFromVector“ („rotationMatrix“, vektoriai); int worldAxisX = „SensorManager.AXIS_X“; int worldAxisZ = „SensorManager.AXIS_Z“;

Kitas žingsnis - naudojant „SensorManager.remapCoordinateSystem ()“ metodą, kad pakeistumėte jutiklio duomenis, atsižvelgiant į dabartinę įrenginio orientaciją.

Metodas „SensorManager.remapCoordinateSystem ()“ pateikia šiuos argumentus:

  • Originali sukimosi matrica.
  • Ašys, kurias norite perdaryti.
  • Masyvas, kurį naudojate šiais naujais duomenimis.

Štai kodas, kurį naudosiu savo programoje:

float sureRotationMatrix = nauja plūdė; „SensorManager.remapCoordinateSystem“ (rotationMatrix, worldAxisX, worldAxisZ, sureguliuotaRotationMatrix);

Galiausiai paskambinsime „SensorManager.getOrientation“ ir liepsime naudoti koreguotąRotationMatrix:

„SensorManager.getOrientation“ (pakoreguotaRotationMatrix, orientacija);

3. Atnaujinkite vietos žymeklio eilutes

Kadangi turime du duomenų rinkinius (aukštį ir ritinį), turime nuskaityti dvi atskiras vietos žymėjimo eilutes, užpildyti jas teisingomis vertėmis ir atnaujinti atitinkamą „TextView“:

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

Kelių jutiklių duomenų rodymas: baigtas kodas

Atlikę aukščiau nurodytus veiksmus, jūsų „MainActivity“ turėtų atrodyti taip:

importuoti „android.app.Activity“; importuoti android.os.Bundle; importuoti android.hardware.Sensor; importuoti „android.hardware.SensorEvent“; importuoti „android.hardware.SensorEventListener“; importuoti „android.hardware.SensorManager“; importuoti „android.widget.TextView“; viešosios klasės „MainActivity“ praplečia veiklą, įgyvendina „SensorEventListener“ {private SensorManager motionSensorManager; privataus jutiklio judesio jutiklis; privatus „TextView“ pitchTextView; privatus „TextView“ rollTextView; privatus statinis galutinis int SENSOR_DELAY = 500 * 1000; privatus statinis galutinis int FROM_RADS_TO_DEGS = -57; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); pitchTextView = („TextView“) „findViewById“ (R.id.pitchTextView); rollTextView = („TextView“) rastiViewById (R.id.rollTextView); pabandykite {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (jutiklis.TYPE_ROTATION_VECTOR); „motionSensorManager.registerListener“ (tai „motionSensor“, „SENSOR_DELAY“); } pagauti (išimtis e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Atšaukti viešą negaliojimą „onAcc pontChanged“ (jutiklio jutiklis, vidinis tikslumas) {// Atlikti //} @Atšaukti viešą negaliojimą „onSensorChanged“ („SensorEvent“ įvykis) {if (event.sensor == motionSensor) {atnaujinti (event.values); }} privatus tuštumų atnaujinimas (plūduriuojantys vektoriai) {// Apskaičiuokite sukimosi matricą // float rotationMatrix = new float; „SensorManager.getRotationMatrixFromVector“ („rotationMatrix“, vektoriai); int worldAxisX = „SensorManager.AXIS_X“; int worldAxisZ = „SensorManager.AXIS_Z“; // Pakartokite matricą, remdamiesi dabartine veiklos orientacija // float sureRotationMatrix = new float; „SensorManager.remapCoordinateSystem“ (rotationMatrix, worldAxisX, worldAxisZ, sureguliuotaRotationMatrix); // Apskaičiuokite prietaisų orientaciją // plūdės orientacija = nauja plūdė; // Pateikite plūduriuojančių verčių masyvą į getOrientation () metodą // SensorManager.getOrientation (sureRotationMatrix, orientacija); plūdės aukštis = orientacija * FROM_RADS_TO_DEGS; plūdinis ritinys = orientacija * FROM_RADS_TO_DEGS; // Atnaujinkite „TextViews“ su žingsnio ir ritinio reikšmėmis // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Galite atsisiųsti baigtą projektą iš „GitHub“.

Išbandome galutinę „Android“ jutiklio programą

Norėdami išbandyti šią sukimosi vektoriaus „Android“ jutiklio programą fiziniame „Android“ išmaniajame telefone ar planšetiniame kompiuteryje:

  • Įdiekite programą į savo įrenginį.
  • Padėkite savo išmanųjį telefoną ar planšetinį kompiuterį ant lygaus paviršiaus. Atminkite, kad judesio jutikliai yra ypač jautrūs, todėl atrodo, kad nejudantis įrenginys praneša apie žingsnio ir riedėjimo verčių svyravimus.
  • Norėdami išbandyti aukštį, pakelkite įrenginio dugną taip, kad jis pasislinktų nuo jūsų. Aukščio vertė turėtų kardinaliai pasikeisti.
  • Norėdami išbandyti ritinį, pabandykite pakelti kairiąją savo įrenginio pusę, kad jis pasvirtų į kairę - nepamirškite šios ritinio vertės!

Jei bandote projektą emuliatoriuje:

  • Įdiekite programą į savo AVD.
  • Pasirinkite „Daugiau“, kuris atidaro langą „Išplėstinis valdymas“.
  • Kairiajame meniu pasirinkite „Virtualūs jutikliai“.
  • Įsitikinkite, kad pasirinktas skirtukas „Akselerometras“. Šiame skirtuke yra valdikliai, kurie gali imituoti įrenginio padėties ir orientacijos pokyčius.
  • Pabandykite eksperimentuoti su įvairiais slankikliais (pasukti: Z-Rot, X-Rot, Y-Rot; perkelti: X, Y ir Z) ir įvairiais mygtukais „Device Rotation“, kad pamatytumėte, kaip jie veikia jūsų programos „Roll Sensor“. “Ir„ pikio daviklio “vertės.

Apvyniojimas

Šiame straipsnyje mes pamatėme, kaip gauti duomenis iš trijų pagrindinių „Android“ jutiklių kategorijų: aplinkos, padėties ir judesio bei kaip šiuos duomenis stebėti realiu laiku.

Ar matėte „Android“ programas, kuriose jutikliai naudojami įdomiai ar unikaliai? Praneškite mums toliau pateiktuose komentaruose!

Ketvirtadienį vykuiame pranešime žurnalitam Roba trayeri, Valtybė departamento ekretoriau pavaduotoja kibernetinė politiko klauimai, atkleidė, kad JAV vyriauybė greičiauiai neatnaujin laikino atiakymo...

Rugpjūčio pabaigoje„The Wall treet Journal“ pakelbė traipnį, kuriame pagrindini dėmey buvo kiriama Kinijo išmaniųjų telefonų gamintojo „Huawei“ įtariamiem patento pažeidimai. Šiandien bendrovė, atakyd...

Įdomios Pareigybės