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

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

Úloha

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:

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

Úloha

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.

Úloha

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.

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.

How Accelerometer Works

Úloha

Zabezpečte, aby aktivita CompassActivity implementovala rozhranie SensorEventListener.

Trieda CompassActivity implementuje rozhranie SensorEventListener

Úloha

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.

Úloha

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

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

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.

Úloha

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

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

Kompas

Úloha

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

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:

<activity android:name=".CompassActivity" android:screenOrientation="portrait">

Úloha

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

// Rotation matrix based on current readings from accelerometer and magnetometer.
final float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, this.accValues, this.magValues);

// Express the updated rotation matrix as three orientation angles.
final float[] orientationAngles = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationAngles);

float azimuth = (float) Math.toDegrees(orientationAngles[0]) % 360;

Animation animation = new RotateAnimation(
        this.currentAzimuth,
        -azimuth,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
);

// how long the animation will take place
animation.setDuration(500);

// set the animation after the end of the reservation status
animation.setFillAfter(true);

this.compass.startAnimation(animation);

this.currentAzimuth = -azimuth;

Úloha

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.

Finálna podoba aplikácie kompas