Senzory Master Android: hardvér, softvér a viacrozmerné

Autor: John Stephens
Dátum Stvorenia: 26 Január 2021
Dátum Aktualizácie: 5 V Júli 2024
Anonim
Senzory Master Android: hardvér, softvér a viacrozmerné - Aplikácie
Senzory Master Android: hardvér, softvér a viacrozmerné - Aplikácie

Obsah


V súčasnosti sú najmodernejšie zariadenia s Androidom vybavené množstvom senzorov.

Tieto informácie môžete použiť mnohými rôznymi spôsobmi - či už ide o sledovanie úrovne osvetlenia, aby vaša aplikácia mohla automaticky upravovať jas alebo farebnú schému; umožnenie používateľovi interagovať s vašou mobilnou hrou pomocou gest, ako je naklonenie zariadenia; alebo pomocou senzora priblíženia na automatické vypnutie dotykových udalostí vždy, keď používateľ drží zariadenie pri uchu.

V tomto článku vytvoríme tri aplikácie, ktoré získavajú údaje o svetle, blízkosti a pohybe z radu hardvérových a softvérových senzorov. Tieto senzory Android monitorujeme aj v reálnom čase, takže vaša aplikácia má vždy prístup k najnovším informáciám.

Na konci tohto článku budete vedieť, ako extrahovať jeden kus údajov zo senzora Android a ako zaobchádzať so senzormi, ktoré poskytujú ich údaje, vo forme viacrozmerného poľa.


Aké senzory Android môžem používať?

Senzory Android je možné rozdeliť do nasledujúcich kategórií:

  • Senzory prostredia. Meria podmienky prostredia, ako je teplota vzduchu, tlak, vlhkosť a úroveň okolitého svetla.

  • Polohové senzory. Táto kategória zahŕňa senzory, ktoré merajú fyzickú polohu zariadenia, ako sú senzory priblíženia a senzory geomagnetického poľa.
    Pohybové senzory. Tieto senzory merajú pohyb zariadenia a zahŕňajú akcelerometre, gravitačné senzory, gyroskopy a vektorové senzory rotácie.

Okrem toho môžu byť senzory buď:

  • Hardvérové. Sú to fyzické komponenty, ktoré sú zabudované do zariadenia a priamo merajú špecifické vlastnosti, ako je zrýchlenie alebo sila okolitých geomagnetických polí.
  • Softvérový, niekedy známy ako virtuálne senzory alebo kompozitné senzory. Zvyčajne porovnávajú údaje z viacerých senzorov založených na hardvéri. Na konci tohto článku budeme pracovať so senzorom vektora rotácie, čo je softvérový senzor, ktorý kombinuje údaje z akcelerometra zariadenia, magnetometra a gyroskopu.

Senzory prostredia: Meranie okolitého svetla

Svetelný senzor systému Android meria okolité svetlo v „lux“ jednotkách, čo je intenzita svetla vnímaná ľudským okom. Luxusná hodnota uvádzaná senzorom sa môže v rôznych zariadeniach líšiť, takže ak vaša aplikácia vyžaduje konzistentné hodnoty, možno budete musieť s nespracovanými údajmi manipulovať skôr, ako ich použijete vo svojej aplikácii.


V tejto časti sa chystáme vytvoriť aplikáciu, ktorá načíta aktuálnu lux hodnotu zo svetelného senzora zariadenia, zobrazí ju v TextView a potom aktualizuje TextView, keď budú k dispozícii nové údaje.Tieto informácie môžete potom použiť v mnohých aplikáciách, napríklad môžete vytvoriť aplikáciu s horákom, ktorá vyťahuje informácie zo svetelného senzora a potom automaticky upraví silu svojho lúča na základe aktuálnej úrovne osvetlenia.

Vytvorte nový projekt Android s nastaveniami podľa vášho výberu a začnime!

Zobrazenie údajov senzora

Pridám textové zobrazenie, ktoré nakoniec zobrazí údaje, ktoré sme extrahovali zo snímača svetla. Tento TextView sa aktualizuje vždy, keď sú k dispozícii nové údaje, takže užívateľ má vždy prístup k najnovším informáciám.

Otvorte súbor activity_main.xml projektu a pridajte nasledujúce:

Ďalej musíme vytvoriť reťazcový prostriedok „light_sensor“, ktorý je uvedený v našom rozložení. Otvorte súbor strings.xml projektu a pridajte nasledujúce:

Svetelný senzor:% 1 $ .2f

Zástupný symbol „% 1 $ .2f“ je zástupný symbol, ktorý určuje informácie, ktoré chceme zobraziť, a spôsob ich formátovania:

  • %1. Do jedného prostriedku reťazca môžete vložiť viacero zástupných symbolov; „% 1“ znamená, že používame jeden zástupný symbol.
  • $.2. Toto určuje, ako má naša aplikácia formátovať každú prichádzajúcu hodnotu s pohyblivou rádovou čiarkou. „$ .2“ znamená, že hodnota by sa mala zaokrúhliť na dve desatinné miesta.
  • F. Naformátujte hodnotu ako číslo s pohyblivou rádovou čiarkou.

Aj keď sú niektoré senzory bežnejšie ako iné, nikdy by ste nemali predpokladať, že každé zariadenie má prístup k rovnakému hardvéru a softvéru. Dostupnosť senzorov sa môže v rôznych verziách systému Android líšiť, pretože niektoré senzory boli predstavené až v neskorších vydaniach platformy Android.

Pomocou rámca snímačov Android môžete skontrolovať, či je na zariadení určitý senzor. Potom môžete deaktivovať alebo povoliť časti vašej aplikácie na základe dostupnosti senzorov alebo sa môže zobraziť vysvetlenie, že niektoré z funkcií vašej aplikácie nebudú fungovať podľa očakávania.

Aj keď máme otvorený súbor strings.xml, vytvorme reťazec „no_sensor“, ktorý sa zobrazí, ak nebude k dispozícii senzor svetla:

Nie je k dispozícii žiadny svetelný senzor

Ak vaša aplikácia nemôže poskytnúť dobrý dojem používateľa bez prístupu ku konkrétnemu senzoru, musíte tieto informácie pridať do svojho manifestu. Napríklad, ak vaša aplikácia vyžaduje prístup k senzoru kompasu, môžete použiť nasledujúce:

Teraz môžete svoju aplikáciu stiahnuť iba do zariadení, ktoré majú snímač kompasu.

Aj keď to môže obmedziť vaše publikum, je oveľa menej škodlivé ako umožniť niekomu stiahnuť vašu aplikáciu, keď sa práve nachádza zaručená mať zlú skúsenosť kvôli konfigurácii senzorov ich zariadenia.

Komunikácia so senzorom: SensorManager, SensorEvents a poslucháči

Ak chcete komunikovať so senzorom svetla zariadenia, musíte vykonať nasledujúce kroky:

1. Získajte inštanciu SensorManagera

SensorManager poskytuje všetky metódy, ktoré potrebujete na prístup k celej škále senzorov zariadenia.

Ak chcete začať, vytvorte premennú, ktorá bude obsahovať inštanciu SensorManagera:

private SensorManager lightSensorManager;

Potom musíte získať inštanciu SensorManagera vyvolaním metódy Context.getSystemService a odovzdaním argumentu Context.SENSOR_SERVICE:

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

2. Získajte odkaz na lightTextView

Ďalej musíme vytvoriť súkromnú premennú člena, ktorá bude držať naše objekty TextView, a priradiť ju k nášmu TextView:

súkromný TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. Skontrolujte, či senzor na aktuálnom zariadení existuje

Prístup k určitému senzoru môžete získať volaním metódy getDefaultSensor () a následným odovzdaním príslušného senzora. Typová konštanta pre svetelný senzor je TYPE_LIGHT, preto musíme použiť nasledujúce:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Ak senzor na tomto zariadení neexistuje, potom sa metóda getDefaultSensor () vráti na null a zobrazí sa reťazec „no_sensor“:

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

4. Zaregistrujte poslucháčov senzorov

Zakaždým, keď senzor obsahuje nové údaje, Android vygeneruje objekt SensorEvent. Tento objekt SensorEvent obsahuje snímač, ktorý vygeneroval udalosť, časové razítko a novú hodnotu údajov.

Spočiatku sa zameriame na svetelné a bezdotykové senzory, ktoré vracajú jeden kus údajov. Niektoré senzory však poskytujú viacrozmerné polia pre každý snímač SensorEvent, vrátane vektora snímača rotácie, ktorý preskúmame na konci tohto článku.

Aby sme zaistili, že bude naša aplikácia informovaná o týchto objektoch SensorEvent, musíme zaregistrovať poslucháča pre túto konkrétnu udalosť senzora pomocou registraListener SensorManager ().

Metóda registerListener () má nasledujúce argumenty:

  • Kontext aplikácie alebo aktivity.
  • Typ senzora, ktorý chcete monitorovať.
  • Rýchlosť, s akou by mal senzor odosielať nové údaje. Vyššia miera poskytne vašej aplikácii viac údajov, ale využije tiež viac systémových zdrojov, najmä výdrž batérie. Ak chcete zachovať batériu zariadenia, mali by ste požiadať o minimálne množstvo údajov, ktoré vaša aplikácia vyžaduje. Budem používať SensorManager.SENSOR_DELAY_NORMAL, ktorý odosiela nové údaje každých 200 000 mikrosekúnd (0,2 sekundy).

Keďže počúvanie senzora vyčerpáva batériu zariadenia, nikdy by ste nemali zaregistrovať poslucháčov v metóde onCreate () vo vašej aplikácii, pretože to spôsobí, že senzory budú pokračovať v odosielaní údajov, aj keď je vaša aplikácia na pozadí.

Namiesto toho by ste mali zaregistrovať svoje senzory v metóde životného cyklu aplikácie onStart ():

@Override chránené void onStart () {super.onStart (); // Ak je senzor k dispozícii na aktuálnom zariadení ... // if (lightSensor! = Null) {//….then začne počúvať // lightSensorManager.registerListener (toto, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Implementujte spätné volania SensorEventListener

SensorEventListener je rozhranie, ktoré prijíma oznámenia od SensorManagera
vždy, keď sú k dispozícii nové údaje alebo sa zmení presnosť senzora.

Prvým krokom je zmena nášho podpisu triedy tak, aby implementoval rozhranie SensorEventListener:

public class MainActivity rozširuje AppCompatActivity implementuje SensorEventListener {

Potom musíme implementovať nasledujúce metódy spätného volania:

onSensorChanged ()

Táto metóda sa volá ako reakcia na každý nový senzorEvent.

Údaje senzora sa môžu často rýchlo meniť, takže vaša aplikácia môže pravidelne volať metódu onSensorChanged (). Aby ste udržali hladký chod vašej aplikácie, mali by ste v metóde onSensorChanged () vykonávať čo najmenšiu prácu.

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Úlohy //}

onAccuracyChanged ()

Ak sa presnosť senzora zlepší alebo zníži, systém Android zavolá metódu onAccuracyChanged () a odovzdá mu objekt Sensor obsahujúci novú hodnotu presnosti, napríklad SENSOR_STATUS_UNRELIABLE alebo SENSOR_STATUS_ACCURACY_HIGH.

Svetelný senzor nehlási zmeny presnosti, takže nechám spätné volanie funkcie onAccuracyChanged () prázdne:

@Override public void onAccuracyChanged (Sensor Sensor, int i) {// Úlohy //}}

6. Načítajte hodnotu senzora

Vždy, keď máme novú hodnotu, musíme zavolať metódu onSensorChanged () a načítať reťazec „light_sensor“. Potom môžeme prepísať zástupný text reťazca (% 1 $ .2f) a zobraziť aktualizovaný reťazec ako súčasť nášho TextView:

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Aktuálna hodnota senzora // float currentValue = sensorEvent.values; // Vyhľadajte reťazec „light_sensor“, vložte novú hodnotu a zobrazte ju používateľovi // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Zrušte registráciu vašich poslucháčov

Senzory dokážu generovať veľké množstvo údajov v malom množstve času, aby ste pomohli zachovať zdroje zariadenia, musíte odregistrovať svojich poslucháčov, keď už nepotrebujú.

Ak chcete zastaviť počúvanie udalostí senzora, keď je vaša aplikácia na pozadí, pridajte do metódy životného cyklu projektu onStop () unregisterListener ():

@Override chránené void onStop () {super.onStop (); lightSensorManager.unregisterListener (to); }

Upozorňujeme, že v režime onPause () by ste nemali rušiť registráciu poslucháčov, pretože v systémoch Android 7.0 a vyšších sa môžu aplikácie spúšťať v režime rozdelenej obrazovky a obrazu v obraze, kde sú v pozastavenom stave, ale zostávajú viditeľné na obrazovke.

Používanie svetelných senzorov systému Android: Dokončený kód

Po dokončení všetkých vyššie uvedených krokov by mala MainActivity vášho projektu vyzerať asi takto:

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; importovať android.hardware.Sensor; importovať android.hardware.SensorEvent; import android.hardware.SensorEventListener; importovať android.hardware.SensorManager; importovať android.widget.TextView; verejná trieda MainActivity rozširuje AppCompatActivity // Implementuje rozhranie SensorEventListener // implementuje SensorEventListener {// Vytvorte svoje premenné // súkromné ​​Sensor lightSensor; private SensorManager lightSensorManager; súkromný TextView lightTextView; @Override chránené void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Získajte inštanciu SensorManager // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Skontrolujte svetelný senzor // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Ak svetelný senzor neexistuje, zobrazte chybu // String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Override chránené void onStart () {super.onStart (); // Ak je senzor k dispozícii na aktuálnom zariadení ... // if (lightSensor! = Null) {//….then zaregistrujte poslucháča // lightSensorManager.registerListener (toto, lightSensor, // Zadajte, ako často chcete prijímať nové údaje // SensorManager.SENSOR_DELAY_NORMAL); }} @Override chránené void onStop () {super.onStop (); // Zrušte registráciu vášho poslucháča // lightSensorManager.unregister Listener (this); } @Override public void onSensorChanged (SensorEvent sensorEvent) {// Aktuálna hodnota senzora // float currentValue = sensorEvent.values; // Vyhľadajte reťazec „light_sensor“, vložte novú hodnotu a aktualizujte TextView // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @Override // Ak sa zmení presnosť senzora… .// verejná neplatnosť onAccuracyChanged (senzor senzora, int i) {// TO DO //}}

Otestujte svoju dokončenú aplikáciu pre senzory Android

Testovanie tejto aplikácie na fyzickom smartfóne alebo tablete s Androidom:

  • Nainštalujte projekt do svojho zariadenia (výberom „Spustiť> Spustiť“ na paneli s nástrojmi Android Studio).
  • Aj keď sa medzi zariadeniami líši, svetelný senzor sa často nachádza v pravom hornom rohu obrazovky. Ak chcete manipulovať s úrovňami svetla, posuňte zariadenie bližšie k svetelnému zdroju a potom ďalej. Prípadne môžete skúsiť zakryť zariadenie rukou, aby ste zablokovali svetlo. Hodnota „Svetelný senzor“ by sa mala zvyšovať a znižovať v závislosti od množstva dostupného svetla.

Ak používate virtuálne zariadenie Android (AVD), potom má emulátor sadu ovládacích prvkov virtuálneho senzora, ktoré môžete použiť na simuláciu rôznych udalostí senzora. K týmto ovládacím prvkom virtuálneho senzora sa dostanete prostredníctvom okna rozšírených ovládacích prvkov emulátora:

  • Nainštalujte aplikáciu do svojho AVD.
  • Popri AVD uvidíte pruh tlačidiel. Nájdite tlačidlo s tromi bodkami „Viac“ (kde je kurzor umiestnený na nasledujúcom obrázku) a kliknite naň. Týmto sa otvorí okno „Rozšírené ovládacie prvky“.

  • V ponuke naľavo vyberte možnosť Virtuálne senzory.
  • Vyberte kartu „Ďalšie senzory“. Táto karta obsahuje rôzne posúvače, ktoré môžete použiť na simuláciu udalostí snímačov polohy a okolia.

  • Nájdite posúvač „Svetlo (lux)“ a potiahnite ho doľava a doprava, aby ste zmenili simulované úrovne svetla. Vaša aplikácia by mala tieto zmeny zobraziť v reálnom čase.

Dokončený projekt si môžete stiahnuť z GitHubu.

Meranie vzdialenosti pomocou senzorov priblíženia Android

Teraz sme videli, ako získavať informácie z environmentálneho senzora. Pozrime sa, ako by ste tieto znalosti aplikovali na pozície snímač.

V tejto časti použijeme snímač vzdialenosti zariadenia na sledovanie vzdialenosti medzi smartfónom alebo tabletom a inými objektmi. Ak má vaša aplikácia akúkoľvek hlasovú funkciu, potom vám snímač priblíženia môže pomôcť určiť, kedy sa smartphone drží pri uchu používateľa, napríklad keď práve telefonuje. Tieto informácie môžete potom použiť na zakázanie dotykových udalostí, aby sa používateľ náhodou nezaviazal, alebo aby v polovici konverzácie spustil iné nežiaduce udalosti.

Vytvorenie používateľského rozhrania

Budem zobrazovať údaje o blízkosti na obrazovke, aby ste ich mohli sledovať v reálnom čase. Aby sme vám pomohli udržať veci v jednoduchosti, znova použite veľkú časť rozloženia z našej predchádzajúcej aplikácie:

Potom otvorte súbor strings.xml a vytvorte reťazec „proximity_sensor“. Tento reťazec musí opäť obsahovať zástupný znak, ktorý bude nakoniec vyplnený údajmi extrahovanými z bezdotykového snímača:

Senzor priblíženia Senzor priblíženia:% 1 $ .2f Nie je k dispozícii žiadny snímač vzdialenosti

Získavanie údajov zo snímača vzdialenosti

Podobne ako v prípade svetelného senzora, proximitný senzor systému Android vracia jedinú hodnotu údajov, čo znamená, že väčšinu kódu môžeme znova použiť z predchádzajúcej aplikácie. Existuje však niekoľko významných rozdielov a niektoré zmeny súvisiace s menom, ktoré uľahčujú sledovanie tohto kódu:

  • Vytvorte inštanciu SensorManageru, ktorú tentokrát pomenujem „proximitySensorManager“.
  • Získajte inštanciu „proximitySensorManager“.
  • Vytvorte odkaz na „proximityTextView“.
  • Zavolajte metódu getDefaultSensor () a odovzdajte ju snímaču TYPE_PROXIMITY.
  • Zaregistrujte a zrušte registráciu poslucháčov pre senzor priblíženia.

Po vykonaní týchto vylepšení by ste mali skončiť s nasledujúcim:

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; importovať android.hardware.Sensor; importovať android.hardware.SensorEvent; importovať android.hardware.SensorManager; import android.hardware.SensorEventListener; importovať android.widget.TextView; verejná trieda MainActivity rozširuje AppCompatActivity // Implementuje rozhranie SensorEventListener // implementuje SensorEventListener {// Vytvorte svoje premenné // súkromné ​​Sensor proximitySensor; súkromný senzorManager proximitySensorManager; súkromný TextView proximityTextView; @Override chránené void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); proximityTextView = (TextView) findViewById (R.id.proximityTextView); // Získajte inštanciu SensorManager // proximitySensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Skontrolujte prítomnosť senzora priblíženia // proximitySensor = proximitySensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Ak senzor priblíženia neexistuje, zobrazí sa chyba // String sensor_error = getResources (). GetString (R.string.no_sensor); if (proximitySensor == null) {proximityTextView.setText (sensor_error); }} @Override chránené void onStart () {super.onStart (); // Ak je senzor k dispozícii na aktuálnom zariadení ... // if (proximitySensor! = Null) {//….then zaregistrujte poslucháča // proximitySensorManager.registerListener (this, proximitySensor, // Zadajte, ako často chcete) prijímať nové údaje // SensorManager.SENSOR_DELAY_NORMAL); }} @Override chránené void onStop () {super.onStop (); // Zrušte registráciu svojho poslucháča, aby sa zachovali systémové prostriedky // proximitySensorManager.unregisterListener (this); } @Override public void onSensorChanged (SensorEvent sensorEvent) {// Aktuálna hodnota senzora // float currentValue = sensorEvent.values; // Vyhľadajte reťazec „proximity_sensor“, vložte novú hodnotu a aktualizujte TextView // proximityTextView.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @Override // Ak sa zmení presnosť senzora… .// verejná neplatnosť onAccuracyChanged (senzor senzora, int i) {//...TO DO //}}

Testovanie: Ako blízko je používateľ k svojmu zariadeniu?

Ak chcete túto aplikáciu otestovať na fyzickom smartfóne alebo tablete s Androidom, nainštalujte aplikáciu do svojho zariadenia a potom experimentujte pohybom ruky smerom k obrazovke a potom ju znova odsuňte. Hodnota „Senzor priblíženia“ by mala zaznamenávať vaše pohyby.

Nezabudnite, že snímače vzdialenosti sa môžu medzi zariadeniami líšiť. Niektoré zariadenia môžu zobrazovať iba dve hodnoty blízkosti - jednu na označenie „Blízko“ a druhú na „Ďalekohľad“ - preto vás neprekvapuje, ak na svojom fyzickom zariadení s Androidom nevidíte veľa rôznych možností.

Testovanie tejto aplikácie na emulátore:

  • Nainštalujte svoju aplikáciu na AVD.
  • Nájdite tlačidlo s tromi bodkami „More“ a kliknite naň, čím sa otvorí okno „Extended Controls“.
  • V ľavej ponuke okna vyberte možnosť Virtuálne senzory.
  • Vyberte kartu „Ďalšie senzory“.
  • Nájdite posúvač „Blízkosť“ a ťahaním doľava a doprava napodobnite objekt, ktorý sa posúva bližšie k zariadeniu a potom ďalej. Hodnoty „senzora priblíženia“ by sa mali zmeniť pri manipulácii s posúvačom.

Dokončený projekt si môžete stiahnuť z GitHubu.

Pohybové senzory: Spracúvanie viacrozmerných polí

Až do tohto bodu sme sa sústredili na senzory, ktoré dodávajú jednu položku údajov, ale existujú senzory, ktoré poskytujú viacrozmerné polia pre každý senzorEvent. Tieto multidimenzionálne senzory zahŕňajú senzory pohybu, na ktoré sa v tejto záverečnej časti zameriame.

Senzory pohybu vám môžu pomôcť:

  • Poskytnite alternatívnu metódu vstupu používateľa. Ak napríklad vyvíjate mobilnú hru, používateľ by mohol nakloniť svoj znak po obrazovke naklonením svojho zariadenia.
  • Vyvodiť aktivitu používateľa. Ak ste vytvorili aplikáciu na sledovanie aktivít, potom vám senzory pohybu pomôžu zistiť, či používateľ cestuje v aute, jogging alebo sedí pri stole.
  • Presnejšie určte orientáciu.Je možné extrahovať súradnice z pohybových senzorov zariadenia a potom ich preložiť na základe súradnicového systému Zeme, aby ste získali čo najpresnejší pohľad na aktuálnu orientáciu zariadenia.

V tejto záverečnej časti budeme používať snímač vektora rotácie (TYPE_ROTATION_VECTOR). Na rozdiel od senzorov svetla a blízkosti je to softvérový senzor, ktorý zhromažďuje údaje zo senzorov akcelerometra, magnetometra a gyroskopu. Aj keď práca s týmto senzorom často vyžaduje vykonanie matematických prevodov a transformácií, môže vám tiež poskytnúť množstvo vysoko presných informácií o zariadení.

Vytvoríme aplikáciu, ktorá na meranie použije vektorový snímač rotácie:

  • Pitch. Toto je naklonenie zariadenia zhora nadol.
  • Roll. Toto je naklonenie zariadenia zľava doprava.

Zobrazenie údajov výšky tónu a rolovania v reálnom čase

Keďže meráme dve metriky, musíme vytvoriť dva textové zobrazenia a dva zodpovedajúce zdroje reťazcov:

Otvorte súbor strings.xml a pridajte nasledujúce:

MotionSensors Senzor výšky tónu:% 1 $ .2f Snímač snímania:% 1 $ .2f Nie je k dispozícii žiadny snímač pohybu

Použitie senzora vektora rotácie v aplikácii

Budeme znova používať niektorý kód z našich predchádzajúcich aplikácií, takže sa zamerajme na oblasti, v ktorých komunikuje so senzorom vektora rotácie, sa výrazne líši od toho, čo sme predtým videli.

1. Použite TYPE_ROTATION_VECTOR

Keďže pracujeme so senzorom vektora rotácie, musíme zavolať metódu getDefaultSensor () a potom ju odovzdať konštantu TYPE_ROTATION_VECTOR:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. Preložte údaje senzora

Na rozdiel od predchádzajúcich svetelných a bezdotykových senzorov vracajú pohybové senzory multidimenzionálne polia hodnôt senzorov pre každý snímač SensorEvent. Tieto hodnoty sa formátujú pomocou štandardného súradnicového systému „X, Y, Z“, ktorý sa počíta vzhľadom na zariadenie, keď je držaný v predvolenej „prirodzenej“ orientácii.

Android neprepína tieto súradnice X, Y a Z tak, aby zodpovedali aktuálnej orientácii zariadenia, takže os „X“ zostane rovnaká bez ohľadu na to, či je zariadenie v režime na výšku alebo na šírku. Pri použití vektorového snímača rotácie bude možno potrebné skonvertovať prichádzajúce údaje tak, aby zodpovedali aktuálnej rotácii zariadenia.

Na výšku je predvolená orientácia väčšiny smartfónov, nemali by ste však predpokladať, že sa tak stane všetko Zariadenia Android, najmä tablety. V tomto článku použijeme rotačnú maticu na preklad údajov senzora z pôvodných, zariadenie súradnicový systém, zemskej súradnicový systém, ktorý predstavuje pohyb a polohu zariadenia vo vzťahu k Zemi. Ak je to potrebné, môžeme údaje senzora premapovať na základe aktuálnej orientácie zariadenia.

Po prvé, súradnicový systém zariadenia je štandardný 3-osový súradnicový systém X, Y, Z, kde každý bod na každej z troch osí je reprezentovaný 3D vektorom. To znamená, že musíme vytvoriť rad 9 plávajúcich hodnôt:

float rotationMatrix = new float;

Toto pole potom môžeme odovzdať metóde getRotationMatrix ():

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

Ďalším krokom je použitie metódy SensorManager.remapCoordinateSystem () na premapovanie údajov senzora na základe aktuálnej orientácie zariadenia.

Metóda SensorManager.remapCoordinateSystem () má nasledujúce argumenty:

  • Pôvodná rotačná matica.
  • Osi, ktoré chcete premapovať.
  • Pole, ktoré zaplňujete týmito novými údajmi.

Tu je kód, ktorý budem používať vo svojej aplikácii:

float upravenéRotationMatrix = nový plavák; SensorManager.remapCoordinateSystem (rotáciaMatrix, worldAxisX, worldAxisZ, adjustRotationMatrix);

Nakoniec zavoláme SensorManager.getOrientation a povieme, aby použil upravenúRotationMatrix:

SensorManager.getOrientation (adjustRotationMatrix, orientácia);

3. Aktualizujte zástupné reťazce

Pretože máme dve sady údajov (výška a váha), musíme načítať dva samostatné zástupné reťazce, vyplniť ich správnymi hodnotami a potom aktualizovať príslušné TextView:

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

Zobrazenie viacerých údajov senzora: Dokončený kód

Po vykonaní vyššie uvedených krokov by mala vaša MainActivity vyzerať asi takto:

import android.app.Activity; import android.os.Bundle; importovať android.hardware.Sensor; importovať android.hardware.SensorEvent; import android.hardware.SensorEventListener; importovať android.hardware.SensorManager; importovať android.widget.TextView; verejná trieda MainActivity rozširuje aktivitu implementuje SensorEventListener {private SensorManager motionSensorManager; súkromný senzor motion motionensens; súkromné ​​TextView pitchTextView; súkromný TextView rollTextView; súkromné ​​statické finále int SENSOR_DELAY = 500 * 1000; súkromné ​​statické finále int FROM_RADS_TO_DEGS = -57; @Override chránené void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); vyskúšajte {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (this, motionSensor, SENSOR_DELAY); } catch (Výnimka e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Override public void onAccuracyChanged (Sensor Sensor, int presnosť) {// Úlohy //} @Override public void onSensorChanged (SensorEvent event) {if (event.sensor == motionSensor) {update (event.values); }} aktualizácia neaktívnych medzier (vektory float) {// Vypočítajte maticu rotácie // float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector (rotationMatrix, vektory); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Premapujte maticu na základe aktuálnej orientácie aktivity // float adjustRotationMatrix = new float; SensorManager.remapCoordinateSystem (rotáciaMatrix, worldAxisX, worldAxisZ, adjustRotationMatrix); // Vypočítajte orientáciu zariadení // float orientácia = new float; // Dodajte pole float hodnôt metóde getOrientation () // SensorManager.getOrientation (adjustRotationMatrix, orientácia); float pitch = orientácia * FROM_RADS_TO_DEGS; float roll = orientácia * FROM_RADS_TO_DEGS; // Aktualizujte TextViews hodnotami výšky a hodenia // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Dokončený projekt si môžete stiahnuť z GitHubu.

Testovanie našej konečnej aplikácie senzorov pre Android

Ak chcete otestovať túto rotačnú aplikáciu snímača Android na fyzickom smartfóne alebo tablete s Androidom:

  • Nainštalujte aplikáciu do svojho zariadenia.
  • Položte svoj smartphone alebo tablet na rovný povrch. Upozorňujeme, že senzory pohybu sú mimoriadne citlivé, takže nie je neobvyklé, že zdanlivo nehybné zariadenie vykazuje výkyvy hodnôt výšky a natočenia.
  • Ak chcete testovať výšku tónu, zdvihnite spodnú časť zariadenia tak, aby sa od vás nakláňala. Hodnota výšky tónu by sa mala dramaticky zmeniť.
  • Ak chcete otestovať hodenie, skúste zdvihnúť ľavú stranu zariadenia, aby sa nakláňalo doľava - dajte pozor na hodnotu hodenia!

Ak testujete svoj projekt na emulátore:

  • Nainštalujte aplikáciu do svojho AVD.
  • Vyberte „More“, čím sa otvorí okno „Extended Controls“.
  • V ponuke naľavo vyberte možnosť Virtuálne senzory.
  • Uistite sa, že je vybratá karta „Accelerometer“. Táto karta obsahuje ovládacie prvky, ktoré môžu simulovať zmeny polohy a orientácie zariadenia.
  • Skúste experimentovať s rôznymi jazdcami (Otočiť: Z-Rot, X-Rot, Y-Rot; a Move: X, Y a Z) a rôznymi tlačidlami „Rotácia zariadenia“, aby ste zistili, ako ovplyvňujú aplikáciu „Snímač Roll“ vo vašej aplikácii. “A„ Pitch Sensor “.

Zabalenie

V tomto článku sme videli, ako získavať údaje z troch hlavných kategórií snímačov Android: prostredie, poloha a pohyb a ako tieto údaje sledovať v reálnom čase.

Už ste videli nejaké aplikácie pre Android, ktoré používajú senzory zaujímavým alebo jedinečným spôsobom? Dajte nám vedieť v komentároch nižšie!

poločnoť Brawl tar a konečne začala celovetovo používať na platformách Android a iO a vyzerá to, že vývojár poločnotí Clah of Clan a Clah Royale by mohol mať na ruká...

Breaking Bad má teraz kritickú pochvalu a širokú popularitu poča vojho behu. Teraz má voju vlatnú mobilnú hru. názvom Breaking Bad: Criminal Element je hra zadarmo ...

Vzhľad