Cvičenie 7 - GPS, Mapy a Geolokalizácia

Cieľom siedmeho cvičenia je precvičenie základnej práce s GPS pozíciou používateľa a jednoduchej interakcie s mapou.

Určovanie polohy

V OS Android existuje niekoľko spôsobov pre zistenie aktuálnej pozície zariadenia:

  • z GSM signálu - na základe triangulácie BS staníc GSM operátora. Táto služba je pomerne nepresná, ale je šetrná k batérii a nevyžaduje žiadne špeciálne senzory.
  • z aktuálne pripojenej WiFi siete - zistenie polohy vyžaduje aktívne pripojenie k WiFi, ktoré je náročné na baterku.
  • z GPS senzora - najpresnejšia poloha s najväčším počtom informácií.
  • Aplikácie, ktoré používajú lokalizačné služby, musia požiadať povolenie poskytnutia údajov o polohe. Android má dve úrovne oprávnení:

    V aplikáciách môžeme využiť tieto senzory dvoma spôsobmi. Buď využijeme nízkoúrovňové API android.location, alebo komplexnejšiu službu Google Location Services API.

    android.location

  • Zisťovanie polohy má na starosti systémová služba LocationManager
  • Umožňuje určiť poslednú známu polohu používateľa, prípadne informáciu, ak sa zariadenie blíži alebo vzďaľuje od určenej geografickej oblasti.
  • Inštanciu objektu LocationManager získame pomocou metódy:
  • Registrácia listenera

    Listenerom zmeny polohy bude naša aktivita, ktorú necháme implementovať interface LocationListener a jeho štyri metódy:

  • onLocationChanged() - volá sa v prípade, ak sa zmenila poloha zariadenia. Parametrom je objekt typu Location, ktorý obsahuje zemepisnú šírku, dĺžku, výšku, azimut..
  • onStatusChanged(), onProviderEnabled() a onProviderDisabled() súvisia so zmenou stavu poskytovateľov polohy (location provider). Volajú sa v situáciách, keď používateľ povolí, či zakáže GPS, alebo v prípade vypadku signálu.
  • public class MainActivity extends AppCompatActivity implements LocationListener {

    Ak je aktivita listenerom, môžeme ju registrovať v správcovi polohy cez metódu requestLocationUpdates(). Tá však potrebuje štyri parametre:

  • Identifikátor poskytovateľa dát o polohe. Uvedieme identifikátor poskytovateľa, buď napevno, alebo na základe vyhľadávania vhodného poskytovateľa pomocou kritérií.
  • Minimálna zmena vo vzdialenosti v metroch, ktorá bude považovaná za zmenu polohy
  • Periódu získavania vzdialenosti, počas ktorej bude sledovaná zmena.
  • Listener zmeny polohy teda objekt typu LocationListener

  • Výsledná aktivita môže vyzerať napríklad takto:

    V našom testovacom prípade sme zvolili periódu 5ms a vzdialenosť 5 metrov. V praxi je to pomerne krátka perióda, ktorá extrémne vyťaží baterku.

    Výpočet vzdialenosti

    Ak sme zistili polohu, vieme ju použiť na prepočítanie vzdialenosti.

  • Pre testovacie účely, vytvoríme objekt typu Location a nastavíme geografické koordináty (cez setLatitude() a setLongitude())
  • Vzdialenosť môžeme prepočítavať cez metódu distanceTo(), ktorá vráti výsledok v metroch
  • Pre zaokrúhlenie použijeme napríklad DecimalFormat
  • Google Location & Map Services API

  • Toto API je súčasťou Google Play services, je jednoduché, s vyššou presnosťou a hlavne šetrí batériu zariadenia.
  • Vyžaduje získanie kľúča k API a nie je k dispozícii na zariadeniach, ktoré nemajú prístup k Google API (teda Amazon Fire a pod.)
  • V prvom kroku si vytvoríme nový projekt so základnou šablonou Google Maps Activity a pridáme potrebné povolenia do manifestu.

    Následne pridáme do gradle súboru aplikácie závislosť pre play-services-maps a play-services-location

    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.android.gms:play-services-location:17.0.0'

    Vytvoríme jednoduchý layout

    Úloha 5.1

    Vytvorte Google Maps API key na stránke https://console.cloud.google.com/.

  • Ak ste postupovali podľa pokynov, mala by sa vám zobraziť aktivita s označeným mestom Sydney na mape.
  • Získanie aktuálnej polohy

    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í.

    Interval aktualizácií hodnôt má priamy vplyv na spotrebu batérie vášho zariadenia.

    Nad vytvoreným klientom typu FusedLocationProviderClient zavoláme metódu requestLocationUpdates(request, callback).

    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.

    Úloha 5.2

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

    Google Maps Activity

    Pre interakciu s mapou môžeme použiť napríklad .setOnMapClickListener a pridať Marker na danú pozíciu kliku.

    V tomto kroku označíme aktuálnu polohu na mape prostredníctvom Markera:

    Ak chceme nakresliť čiaru medzi jednotlivými bodmi použijeme Polyline, alebo Circle pre kružnicu: