Image
1.12.2015 0 Comments

Vývoj pre Android - Mapy a lokalizácia / 15. časť

Späť na úvod >> Späť na seriál

Telefóny aj niektoré tablety platformy Android disponujú obvodmi na príjem signálu GPS z družíc, takže po spojení s mapovými službami nie je problém vytvárať aplikácie, ktoré budú údaje o polohe využívať.

Lokalizačné služby dodávajú mobilným aplikáciám novú dimenziu, pretože aplikácia môže poskytovať používateľovi informácie vzhľadom na jeho momentálnu polohu. Napríklad aplikácia s prehľadom jedálnych lístkov zobrazí ponuku reštaurácií ponúkajúcich vybrané jedlo, zoradených v poradí od najbližšej k aktuálnej polohe používateľa. Takisto môžete vytvárať špecializované aplikácie typu navigácie, trackera či geofence, napríklad na sledovanie pohybu detí a starých ľudí.

Android ponúka triedu Location, ktorá reprezentuje polohu. Inštancia triedy Location obsahuje údaje o zemepisnej dĺžke, šírke a aktuálnom čase, ako aj informáciu o aktuálnej presnosti polohy, nadmorskej výške, rýchlosti, azimute a podobne. Obsahuje objekty:

LocationProvider - androidové zariadenia môžu určovať aktuálnu polohu nielen zo signálu GPS, ale aj trianguláciou staníc GSM či z prístupových bodov Wi-Fi.

Aplikácie, ktoré používajú lokalizačné služby, musia požiadať o povolenie poskytnutia údajov o polohe. Android má dve úrovne oprávnení:

  • android.permission.ACCESS_COARSE_LOCATION (približná poloha, zhruba na úrovni mestského bloku)
  • android.permission.ACCESS_FINE_LOCATION (presná poloha)

LocationManager - systémová služba na získanie informácií o polohe. 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ískate pomocou metódy

getSystemService(Context.LOCATION_SERVICE)

LocationListener volá callback metódy, ak sa zmení stav objektov typu Location alebo LocationProvider.

  • onLocationChanged(): volá sa v prípade, ak sa zmenila poloha. Údaje o aktuálnej polohe sú objekte typu Location. Môžete zistiť zemepisnú šírku (latitude), zemepisnú dĺžku (longitude), vzdialenosť od inej lokácie (distance), výšku (altitude) a azimut (bearing), t. j. uhol od severu
  • onProviderEnabled(): ak používateľ zapne/povolí vyžadovaný provider
  • onProviderDisabled(): ak sa používateľ vypne/zakáže vyžadovaný provider
  • onStatusChanged(): ak sa zmení stav poskytovateľa

Príklad určenia polohy zariadenia

V jednoduchom príklade zobrazíme iba zemepisné súradnice zistené cez GPS. Preto vynecháme kód návrhu layoutu hlavnej aktivity, ktorá obsahuje len dva prvky TextView na zobrazenie textových reťazcov.

V AndroidManifest.xml deklarujte oprávnenie aplikácie pristupovať ku geografickej polohe a k internetu.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>

V kóde hlavnej aktivity budeme periodicky zisťovať a vypisovať zemepisné súradnice, samozrejme, iba v prípade, ak to nastavenie zariadenia umožní.

Informácie o polohe bude aplikácia zisťovať cez metódu requestLocationUpdates(). Prvý parameter, ktorého hodnotu nastavíme na GPS_PROVIDER, definuje využívanie presnej polohy GPS. Druhý parameter udáva periódu aktualizácií v milisekundách. Ako kompromis sme v aplikácii nastavili 3 sekundy, aby sme boli trochu ohľaduplní k batérii zariadenia. Druhý parameter udáva vzdialenosť v metroch, ktorá vyvolá aktualizáciu. Ak nepotrebujete zmenu po metroch, ktorá je náročná na výpočtový výkon, a teda aj spotrebu energie z batérie, nastavte tento parameter na nulu.

Pomocou metódy getBestProvider vyberáte operátorov podľa definovaných kritérií. Spravidla kritériom bude nájsť najlepšieho operátora, ktorý nevyžaduje spoplatnenie.

public class MainActivity extends Activity implements LocationListener
{
private TextView latitute, longitude;
private LocationManager locationManager;
private String provider;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
latitute = (TextView) findViewById(R.id.latitude);
longitude = (TextView) findViewById(R.id.longitude);
locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
onLocationChanged(location);
}
@Override
protected void onResume()
{
super.onResume();
locationManager.requestLocationUpdates(provider, 3000, 1, this);
}
@Override
public void onLocationChanged(Location location)
{
double lat = location.getLatitude();
double lng = location.getLongitude();
latitute.setText("Zemepisná šírka: " + String.valueOf(lat));
longitude.setText("Zemepisná dlžka" + String.valueOf(lng));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
}

Zistíte, že aplikácia v dosahu GPS funguje, a po čase zistíte aj ďalšiu vec - že sa zariadenie zohrieva viac, než je obvyklé, a že rýchlo klesá kapacita batérie. Zisťovanie súradníc zo signálu GPS je totiž veľmi výpočtovo náročné, a preto treba polohu zisťovať len vtedy, ak je to nevyhnutné.

Zobrazenie polohy na mape

Zobrazenie polohy na mape je vizuálna reprezentácia polohy. Google poskytuje mapovú službu Google Maps Android API. Služba poskytuje niekoľko typov máp:

  • Normal - klasické cestné mapy
  • Satellite - snímky zemského povrchu
  • Hybrid - kombinácia snímok a klasickej cestnej mapy
  • Terrain - zobrazenie topografických detailov, napríklad výškových rozdielov a podobne

Typy máp

Androidová aplikácia dokáže prispôsobiť zobrazenie mapy požiadavkám používateľa. Umožňuje pridať ikony, tzv. markery, na konkrétne miesta na mape alebo kresliť na popredie, pričom mapový podklad je na pozadí. Mapa takisto môže reagovať na gestá, najčastejšie zmenou mierky na gesto zoomovania, a realizovať pootočenie na gesto pootočenia dvoch prstov. API umožňuje aj zobraziť aktuálnu polohu zariadenia.

Google Maps Android API využíva základné triedy:

  • GoogleMap - trieda, ktorá zastupuje a spravuje mapu
  • MapFragment - zobrazenie mapy vo fragmentoch
  • Camera - definuje časti mapy, ktoré sa zobrazia na obrazovke, a bod, z ktorého by tento pohľad zosnímala fiktívna kamera
  • Marker - trieda reprezentuje ikony, niekedy aj vyskakovacie okná, ktoré ukazujú na konkrétne lokality

Prípravné kroky

Pred začiatkom vývoja aplikácie využívajúcej mapové služby treba realizovať niekoľko prípravných krokov. Najskôr musíme nakonfigurovať Google Play Services SDK cez Android SDK Manager. Referenciu na Google Play Services je potrebné pridať do aplikačného manifestu.

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

Následne treba získať kľúč API, ktorý identifikuje vašu aplikáciu. Parametre na nastavenie musíte vložiť do manifestu aplikácie. Získanie kľúča si vyžaduje prihlásenie sa na konzolu Google API. Budete musieť poskytnúť podpisový kľúč aplikácie a názov balíka. Z kľúča sa generuje takzvaný digitálny odtlačok pomocou aplikácie Keytool.exe. Nájdete ju v adresári, do ktorého sa nainštalovala Java.

keytool -list -v -alias androiddebugkey -keystore <zložka>debug.keystore -storepass android -keypass android

Príklad zobrazenia polohy na mape

Aplikácia využívajúca mapové služby vyžaduje v manifeste niekoľko typov oprávnení. Povolenie prístupu na internet nevyžaduje komentár, aplikácia pristupuje na servery Google Map. Oprávnenie ACCESS_NETWORK_STATE je potrebné na zistenie, či možno zo servera sťahovať údaje. Budete nevyhnutne potrebovať aj oprávnenie WRITE_EXTERNAL_STORAGE, pretože mapové údaje musia byť uložené do externého úložiska prístroja. Oprávnenie READ_GSERVICES umožní prístup ku Google Web Services. Prakticky všetky aplikácie pracujúce s mapou potrebujú aj údaj o okamžitej polohe zariadenia, takže budú nevyhnutné aj oprávnenia ACCESS_COARSE_LOCATION a ACCESS_FINE_LOCATION.

Layout hlavnej aktivity obsahuje fragment na zobrazenie mapového podkladu zo služby Google Maps.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<fragment
android:id="@+id/mapa"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
</RelativeLayout>

V kóde hlavnej aktivity sa zobrazí mapa a označíme na nej dva markery, pričom v druhom z nich nastavíme aj vyskakovacie okno s textom a ako obrázok markera použijeme ikonu aplikácie.

public class MainActivity extends Activity
{
static final LatLng LIPTOVSKY_MIKULAS = new LatLng(49.084167, 19.602222);
static final LatLng RUZOMBEROK = new LatLng(49.078611, 19.308333);
private GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.mapa))
.getMap();
Marker lm = map.addMarker(new MarkerOptions().position(LIPTOVSKY_MIKULAS)
.title("Lipt. Mikuláš"));
Marker rbk = map.addMarker(new MarkerOptions()
.position(RUZOMBEROK)
.title("Ružomberok")
.snippet("Moja záujmová oblast")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher)));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(LIPTOVSKY_MIKULAS, 15));
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
}
}

mapy1.jpg

Test aplikácie zobrazujúcej mapu a markery

V príklade sme zobrazovali mapu v aplikácii. Často je v súlade s koncepciou Androidu účelné zobraziť polohu na mape v inej aplikácii, ktorá je na to určená. Ak je takých aplikácií viac, vyberie si najvhodnejšiu používateľ. Preto sa tento problém často rieši tak, že sa zadajú súradnice, názov, prípadne poštová adresa lokality, ktorú chcete zobraziť. Tieto informácie vaša aplikácia odošle ako objekt intent.

 

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá