Tracking Location

GPS sensor, permissions, Fused Location Provider Client

About

V OS Android existuje niekoľko spôsobov, ako je možné zistiť aktuálnu pozíciu zariadenia klienta. V rámci tohto cvičenia sa pozrieme na spôsob, v ktorom využijeme Fused Location Provider API. Toto API je súčasťou Google Play services, je jednoduché a hlavne šetrí batériu zariadenia.

Objectives

  • naučiť sa ošetriť Runtime Permissions
  • naučiť sa základy práce s Fused Provider API

Postup

New Project

V prvom kroku vytvoríme projekt našej aplikácie, nastavíme príslušné práva a doinštalujeme potrebné knižnice.

Úloha 1.1

Vytvorte si nový projekt s názvom Tracker a v ňom aktivitu s názvom MapsActivity, ktorú založíte práve na šablóne Maps Activity.

Úloha 1.2

Aktualizujte rozloženie aktivity pridaním tlačidla a elementu <TextView>.

Rozloženie môžete urobiť ručne alebo môžete využiť tento XML kód:

Úloha 1.3

Do manifestu projektu pridajte povolenia pre ACCESS_FINE_LOCATION a ACCESS_COARSE_LOCATION.

Úloha 1.4

Pridajte do projektu podporu pre Google Maps API a pre Constraint Layout.

Najprv overte, či máte podporu pre Google Play services nainštalovanú cez SDK Manager > SDK Tools > Google Play services. Ak nie, doinštalujte si ju.

Následne pridajte do gradle súboru modulu aplikácie závislosť pre play-services-maps a play-services-location pridaním nasledujúcich riadkov do časti dependencies. Okrem nich aj podporu pre constraint layout.

implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

Poznámka

Aby ste si overili, ktorá verzia uvedených knižníc je posledná, navštívte stránku Set Up Google Play Services.

Úloha 1.5

Otvorte si súbor google_maps_api.xml a podľa pokynov v ňom uvedených si vytvorte Google Maps API key.

Úloha 1.6

Pridajte do projektu podporu knižnice Butter Knife.

Do gradle súboru modulu aplikácie pridajte závislosť pre butterknife-compiler:

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

Úloha 1.7

Spustite vašu aplikáciu.

Ak ste postupovali podľa pokynov, mala by sa vám zobraziť aktivita s označeným mestom Sydney na mape, pod ktorým sa nachádza jeden pohľad pre text a jedno tlačidlo.

Obr. 1: Tracker - Prvé spustenie
Obr. 1: Tracker - Prvé spustenie

Úloha 1.8

Overte, či zariadenie má k dispozícii podporu GPS a ak nie, tak aplikáciu ukončite.

Ak budeme GPS hľadať pomocou objektu SensorManager, tak ho medzi dostupnými senzormi nenájdeme. Na to potrebujeme využiť iný prístup - napríklad sa opýtať Packagemanager-a, či zariadenie neobsahuje vlastnosť označenú ako FEATURE_LOCATION_GPS:

Retrieving Current Location

Aktuálnu polohu získame z objektu FusedLocationProviderClient. Na to však potrebujeme získať pre aplikáciu príslušné povolenia a vytvoriť objekt požiadavky, v ktorej nastavíme niekoľko vlastností. Aby bolo prezentovanie údajov zaujímavejšie, ako zdroj údajov pre GPS môžete použiť súbor morning.travel.gpx.

Úloha 2.1

Získajte objekt klienta FusedLocationProviderClient z objektu LocationServices.

Úloha 2.2

Vytvorte objekt typu LocationRequest, pomocou ktorého nastavíte vlastnosti požiadavky na GPS.

Keďže budeme chcieť pre našu aplikáciu zabezpečiť vysokú presnosť, nastavte:

  • prioritu požiadavky na hodnotu PRIORITY_HIGH_ACCURACY, a
  • interval aktualizácií na hodnotu 2 sekúnd.

Poznámka

Pozor však na interval aktualizácií hodnôt o polohe! Má totiž priamy vplyv na spotrebu batérie vášho zariadenia.

Úloha 2.3

Nad vytvoreným klientom typu FusedLocationProviderClient zavolajte metódu requestLocationUpdates().

Po zavolaní tejto metódy začnú byť doručované správy o zmene polohy z GPS do anonymnej triedy typu LocationCallback, ktorá je parametrom metódy.

Ako Looper môžete uviesť null alebo použiť referenciu na hlavný Looper objekt aplikácie zavolaním metódy getMainLooper(), ktorý sa nachádza v hlavnom vlákne aplikácie.

V metóde onLocationResult() zaznamenajte aktuálne zistenú polohu do členskej premennej triedy MainActivity.

Úloha 2.4

Ošetrite dostupnosť prístupových práv pred volaním metódy requestLocationUpdates().

Úloha 2.5

Ošetrite kliknutie na tlačidlo Get Location tak, aby sa v pohľade pod ním zobrazila aktuálna poloha.

Úloha 2.6

Overte svoju implementáciu.

Ak ste postupovali správne, vaša aktivita po kliknutí na tlačidlo Get Location zobrazí aktuálne súradnice zistené z GPS.

Úloha 2.7

Zabezpečte, aby nedochádzalo k žiadnym aktualizáciám polohy v prípade, ak nie je aplikácia zapnutá, resp. viditeľná.

Podobne, ako v prípade akcelerátora a senzora magnetického poľa, sa na odber informácií o GPS prihlásime v metóde onResume() a odhlásime v metóde onPause(). Za týmto účelom si v metóde onCreate() vytvoríme členskú premennú pre objekt LocationCallback, ktorý vystupuje ako parameter pri volaní metód requestLocationUpdates() a removeLocationUpdates().

Poznámky pre učiteľa

V metóde onCreate() teda vytvoríme členskú premennú objektu LocationCallback:

Prihlásenie sa na odber aktualizácii z GPS presunieme do metódy onResume():

Odhlásenie sa z odberu vykonáme v metóde onPause():

Úloha 2.8

Overte svoju implementáciu.

Google Maps Activity

V tomto kroku sa pozrieme na možnosti práce s Google Maps a budeme značkovať aktuálnu polohu na mape.

Úloha 3.1

Podobným spôsobom ako v predchádzajúcom kroku vytvorte a spojazdnite klienta FusedLocationProviderClient.

Úloha 3.2

Zabezpečte, aby sa na mape vykresľoval na aktuálnej polohe marker.

Úloha 3.3

Overte svoju implementáciu.