Working with Sensors

trieda SensorManager, akcelerometer, senzor magnetického poľa

About

Súčasťou chytrých telefónov sú rozličné senzory. Bežne sa viete stretnúť so zariadeniami, ktoré sú vybavené GPS senzorom, akcelerometrom alebo senzorom intenzity svetla. Dnes sa pozrieme na to, ako k týmto senzorom pristupovať a na dva z nich sa pozrieme zblízka.

Objectives

  • zoznámiť sa so správcom senzorov (SensorManager)
  • zistiť zoznam senzorov dostupných na zariadení
  • zoznámiť sa s objektom reprezentujúcim senzor
  • vytvorenie listener-a pre získavanie dát zo senzora

Postup

Sensor Manager

V prvom kroku vytvoríme kostru aplikácie a vyžiadame si inštanciu triedy SensorManager.

Úloha 1.1

Vytvorte si nový projekt s názvom Compass a v ňom aktivitu s názvom CompassActivity.

Úloha 1.2

V metóde onCreate() získajte referenciu na inštanciu triedy SensorManager.

SensorManager nám pomôže zistiť, aké senzory má zariadenie k dispozícii. Jeho inštanciu získame volaním metódy getSystemService() a odovzdaním argumentu SENSOR_SERVICE:

Úloha 1.3

Získajte zoznam všetkých dostupných senzorov, ktoré obsahuje vaše zariadenie.

Zoznam všetkých dostupných senzorov získate volaním metódy getSensorList() nad objektom SensorManager-a. Metóda getSensorList() očakáva konštantu, pomocou ktorej je možné špecifikovať príslušný typ senzoru, napr. TYPE_GYROSCOPE, TYPE_LINEAR_ACCELERATION alebo TYPE_GRAVITY. Ak použijete konštantu TYPE_ALL, zoznam bude obsahovať všetky senzory, ktoré zariadenie obsahuje. Položky zoznamu budú objekty typu Sensor.

Poznámka

Uvedené konštanty sa nachádzajú v triede Sensor.

Úloha 1.4

Overte, či sa v zozname senzorov vášho zariadenia nachádza akcelerometer a senzor magnetického poľa.

V prípade, že sa v zozname nachádzajú, z ich referencií vytvorte členské premenné. V prípade, že sa v zozname nenachádzajú, ukončite aplikáciu.

Poznámka

getDefaultSensor()

Monitoring Accelerometer Sensor Events

Akcelerometer meria zrýchlenie v osiach x, y a z. Vďaka nemu vieme zistiť napríklad to, ako je chytré zariadenie natočené, ale rovnako aj aktuálne lineárne zrýchlenie. Aby sme mohli s akcelerometrom pracovať (vo všeobecnosti s ľubovoľným senzorom), potrebujeme sa prihlásiť na odber udalostí, ktoré tento senzor emituje. V tomto kroku sa teda pozrieme na to, ako sa prihlásiť na odber príslušných udalostí a ako následne zobrazovať údaje z akcelerometra.

Obr. 1: How Accelerometer Works
Obr. 1: How Accelerometer Works

Úloha 2.1

Zabezpečte, aby aktivita CompassActivity implementovala rozhranie SensorEventListener.

Obr. 2: Trieda CompassActivity implementuje rozhranie SensorEventListener
Obr. 2: Trieda CompassActivity implementuje rozhranie SensorEventListener

Poznámka

Implementovaním rozhrania SensorEventListener implementujete metódy onAccuracyChanged() a onSensorChanged(). Android tieto metódy volá vždy, keď:

  • A sensor’s accuracy changes.
  • A sensor reports a new value.

Úloha 2.2

Zaregistrujte listener, aby sme boli notifikovaní pri každej zmene hodnôt akcelerometra.

Registráciu vykonáte volaním metódy registerListener() nad objektom SensorManager-a. Hodnotu oneskorenia nastavte na SENSOR_DELAY_NORMAL.

Poznámka

Je vhodné, aby aktivita počúvala na zmeny len vtedy, keď je zobrazená. Ak nie je zobrazená, tak nemá počúvanie na zmeny v našom prípade význam. Dokonca môže pri použití niektorých iných senzorov viesť k zvýšeniu spotreby batérie. Preto je vhodné, aby sme listener zaregistrovali vtedy, keď sa aktivita zobrazí a odregistrovali ho zasa vtedy, keď aktivita zmizne. Na tento účel sú vhodné metódy onResume() a onPause().

Úloha 2.3

V metóde onSensorChanged() rozhrania SensorEventListener zapíšte do log-u získané hodnoty z akcelerometra.

Poznámka

Hodnoty si môžete overiť v rozšírených nastaveniach emulátora alebo pomocou niektorej z aplikácií monitorujúcich činnosť senzorov na reálnom zariadení, ako je napr. Sensors Multitool. Obr. 3: Rozšírené nastavenia emulátora

Monitoring Magnetic Field Sensor Events

Bežne sa v rámci jednej aplikácie spracovávajú hodnoty z viacerých senzorov ako len z jedného. OS Android umožňuje v rámci jedného listener-a identifikovať aj senzor, ktorý danú udalosť emitoval, čím je možné tento problém jednoducho vyriešiť. Našim druhým senzorom v tomto prípade bude senzor magnetického poľa, pomocou ktorého dokážeme zistiť našu polohu voči severnému pólu.

Úloha 3.1

Zaregistrujte listener, aby sme boli upozornení aj na zmeny zo senzora magnetického poľa.

Hodnotu oneskorenia nastavte podobne ako v prípade akcelerometra na SENSOR_DELAY_NORMAL.

Poznámka

Listener je potrebné zaregistrovať osobitne, pretože sa viaže na typ senzoru. Pri odregistrovaní to už nie je potrebné. Preto stačí upraviť len kód nachádzajúci sa v metóde onResume().

Úloha 3.2

Aktualizujte metódu onSensorChanged() tak, aby reflektovala senzor, z ktorého boli údaje získané.

The Device’s Orientation

Na to, aby sme zistili orientáciu zariadenia, využijeme kombináciu získaných hodnôt z akcelerometra a senzora magnetického poľa. OS Android obsahuje aj tzv. softvérový senzor, ktorý nám vie príslušné hodnoty priamo poskytnúť.

Úloha 4.1

Medzi zdroje aplikácie si pridajte tento obrázok.

Obr. 4: Kompas
Obr. 4: Kompas

Poznámka

V prípade, že sa vám obrázok nezobrazí na obrazovke vášho zariadenia, zmenšite ho.

Úloha 4.2

Upravte si rozloženie aktivity tak, aby ste v nej mali len obrázok kompasu a priestor pre vypísanie azimutu.

Obrázok pomenujte compass.

Úloha 4.3

Upravte si manifest aplikácie tak, aby sa aktivita CompassActivity neotáčala, ale bola stále fixne orientovaná na stojato.

Otvorte súbor AndroidManifest.xml a element <activity> upravte nasledovne:

Úloha 4.4

Upravte svoj kód tak, aby do metódy onSensorChanged() mohli vložiť nasledujúci fragment kódu.

Úloha 4.5

Otestujte správnosť svojej implementácie.

Pokiaľ ste postupovali správne, na obrazovke vášho zariadenia sa zobrazí ružica kompasu, ktorá bude reagovať na zmeny orientácie zariadenia. Rovnako sa podľa zmien orientácie bude aktualizovať aj hodnota azimutu. Overiť správnosť fungovania môžete napr. pomocou aplikácie Sensors Multitool a opticky, nakoľko hodnota azimutu sa musí zhodovať s hodnotou stupňov na ružici kompasu.

Obr. 5: Finálna podoba aplikácie kompas
Obr. 5: Finálna podoba aplikácie kompas