Wykorzystanie map i geolokalizacji

Podobne dokumenty
Obsługa SMS i telefonii

Programowanie urządzeń mobilnych. projekt 6 ( )

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Systemy operacyjne na platformach mobilnych

Android poradnik programisty

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

akademia androida Pierwsze kroki w Androidzie część I

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Mobilne aplikacje multimedialne

Systemy operacyjne na platformach mobilnych

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda

[Android] Podstawy programowania

Systemy operacyjne na platformach mobilnych

Podstawowe elementy GUI - zadania

Fragmenty są wspierane od Androida 1.6

Laboratorium Systemów Mobilnych. Wykład 1

Programowanie obiektowe

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout

Zaawansowane aplikacje WWW - laboratorium

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Programowanie Urządzeń Mobilnych. Część II: Android. Wykład 2

Zdarzenia Klasa Application Powiadomienia Toast AlertDialog

Tworzenie i wykorzystanie usług

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Laboratorium 9 (Więcej Aktywności, w Androidzie)

akademia androida Składowanie danych część VI

Multimedia JAVA. Historia

Metody dostępu do danych


Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Powiadomienia w systemie Android

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Android, wprowadzenie do SDK

Laboratorium 7 Blog: dodawanie i edycja wpisów

Google Earth. Co to jest Google Earth? Co to jest KML? Skąd można pobrać Google Earth?

Połączenie aplikacji mobilnej z Facebookiem

INSTRUKCJA UŻYTKOWNIKA PORTALU SIDGG

Wprowadzenie do projektu QualitySpy

Klasy i obiekty cz II

akademia androida Service, BroadcastReceiver, ContentProvider część IV

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

TEMAT : KLASY DZIEDZICZENIE

Systemy operacyjne na platformach mobilnych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Korzystanie z edytora zasad grupy do zarządzania zasadami komputera lokalnego w systemie Windows XP

Technologie i usługi internetowe cz. 2

Instrukcja EQU Kantech

Mariusz Fraś. Instytut Informatyki. olitechnika Wrocławska. Systemy Wbudowane. Android. Dr inż. Mariusz Fraś. maf 1

akademia androida Http i AsyncTask część VII

Dokumentacja użytkowa

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Część II Wyświetlanie obrazów

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

ANDROID. OpenGL ES 1.0. Tomasz Dzieniak

Dynamiczne i wydajne tworzenie interfejsu. Piotr Michałkiewicz

Programowanie Obiektowe GUI

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Dodawanie operacji dodatkowych w WAPRO Mag.

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED

komunikator na platformę Android wspierający protokół GG

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Autoryzacja zleceń z użyciem aplikacji Java Web Start "Pocztowy24Podpis"

Programowanie obiektowe

Tworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski

Przesyłanie planowanych odbiorów dostawcy do monitora prognozy zlecenia PL

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

SERWER AKTUALIZACJI UpServ

System Symfonia e-dokumenty

Nawigacja po trasie wycieczki

Exchange 2007 Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange 2007 wersja 1.1 UNIZETO TECHNOLOGIES S.A.

Instrukcja generowania certyfikatu PFRON i podpisywania dokumentów aplikacji SODiR w technologii JS/PKCS 12

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

emszmal 3: Automatyczne księgowanie przelewów w sklepie internetowym Magento (plugin dostępny w wersji ecommerce)

Opis aktualizacji programu Kancelaria Komornika

Tworzenie certyfikatów OpenPGP/GnuPG w programie Kleopatra (element pakietu Gpg4win)

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

akademia androida Sensory część V Mobile Applications Developers

Instrukcja użytkownika

Języki i metody programowania Java Lab2 podejście obiektowe

Instrukcja użytkownika LK100B. Zawartość opakowania

Minimalna wspierana wersja systemu Android to zalecana 4.0. Ta dokumentacja została wykonana na telefonie HUAWEI ASCEND P7 z Android 4.

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie w Javie

Instrukcja korzystania z serwisu Geoportal wybrane zagadnienia dotyczące ochrony przyrody (wersja 1.0)

VectraPortal. VectraPortal. wersja Instrukcja użytkownika Podstawowa funkcjonalność serwisu. [czerwiec 2016]

Programowanie Urządzeń Mobilnych. Laboratorium nr 9,10

Android pierwsza aplikacja

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

emszmal 3: Automatyczne księgowanie przelewów w sklepie internetowym WooCommerce (plugin dostępny w wersji ecommerce)

Transkrypt:

Strona 1 Usługi oparte na położeniu geograficznym Generowanie klucza interfejsu API dla mapy Wyświetlanie mapy Dodawanie własnych danych do mapy Położenie geograficzne Klasa Geocoder i geokodowanie Geokodowanie w tle Usługa LocationManager Klasa MyLocationOverlay Uwaga: cały wykład dotyczy Google Maps API ver. 1 Obsługa zdarzeń dotyku na mapie

Strona 2 Usługi oparte na położeniu geograficznym Android SDK zawiera interfejsy API dzięki którym możliwe jest: 1) wyświetlanie map (kontrolka MapView, klasa MapActivity, usługi Google Maps), 2) manipulowanie mapami (przesuwanie i przybliżanie widoku mapy, zmiana trybu wyświetlania mapy, nakładanie na mapę własnych informacji itp.), 3) uzyskiwanie informacji o położeniu geograficznym urządzenia mobilnego w czasie rzeczywistym (klasa Geocoder, usługa LocationManager), 4) programowa obsługa odbiornika GPS (Global Positioning System). Przeznaczone są do tego: interfejs API map: com.google.android.maps (dla punktów 1 i 2), interfejs API lokalizacji: android.location (dla punktów 3 i 4). Interfejsy te wymagają połączenia internetowego z usługami na serwerach firmy Google oraz zarejestrowania się w celu uzyskania klucza API dla map.

Strona 3 Klucz interfejsu API dla mapy Klucz interfejsu API dla mapy jest niezbędny do nawiązania połączenia z usługą Google Maps i pobrania mapy na urządzenie mobilne. W pewnych sytuacjach, niezbędne mogą być dwa klucze: klucz wykorzystywany podczas działania aplikacji w emulatorze, klucz wykorzystywany podczas działania aplikacji w fizycznym urządzeniu. Aplikacja uruchamiana w emulatorze (na etapie jej tworzenia), podpisywana jest automatycznie tzw. certyfikatem testowym, tworzonym przez środowisko Eclipse. Aplikacja dystrybucyjna (finalna, uruchamiana na fizycznym urządzeniu użytkownika), podpisywana jest przez programistę (np. za pomocą programu jarsigner ) certyfikatem tworzonym przez program keytool. Do podpisu nie można użyć certyfikatu testowego. Oba programy są dostępne w pakiecie Java JDK.

Strona 4 Generowanie klucza interfejsu API dla mapy W celu uzyskania klucza interfejsu API dla mapy należy: 1) odnaleźć certyfikat testowy, który będzie użyty do podpisania aplikacji w emulatorze. Certyfikat testowy na potrzeby emulatora jest tworzony przez środowisko Eclipse (menu Window Preferences Android Build ścieżka pliku certyfikatu debug.keystore jest widoczna w polu Default debug keystore); 2) uzyskać odcisk palca MD5 certyfikatu służy do tego program keytool uruchamiany w wierszu poleceń, dostępny w podkatalogu bin instalacji pakietu Java JDK. nazwa testowego magazynu kluczy keytool v list alias androiddebugkey -keystore pełna ścieżka do pliku debug.keystore -storepass android keypass android hasło do magazynu kluczy hasło do klucza prywatnego Uwaga: nazwy parametrów są istotne nie należy ich zmieniać.

Strona 5 Generowanie klucza interfejsu API dla mapy (c.d.) 3) odcisk palca MD5 certyfikatu testowego zostanie wyświetlony na ekranie po komunikacie Certificate fingerprints (MD5):, np. Certificate fingerprints (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98 4) jeżeli nie posiadamy jeszcze konta pocztowego Google, należy utworzyć je na stronie www.google.com/accounts (przycisk Zarejestruj się ). 5) na stronie internetowej Google: https://developers.google.com/maps/documentation/android/v1/maps-api-signup należy wprowadzić odcisk palca MD5 (patrz krok 3) w polu My certificate's MD5 fingerprint. 6) podczas generowania klucza konieczne będzie zalogowanie się na konto Google (patrz krok 4). 7) po kliknięciu przycisku Generate API Key zostanie wygenerowany klucz skojarzony z certyfikatem testowym. W podobny sposób można wygenerować klucz interfejsu API mapy dla dowolnego certyfikatu utworzonego programem keytool.

Strona 6 Kontrolka MapView Do wyświetlania mapy służy kontrolka MapView oraz współpracująca z nią klasa android.app.mapactivity. Opis właściwości kontrolki MapView w pliku XML zawiera pole android:apikey, w którym należy podać klucz interfejsu API dla mapy. Jeżeli kontrolka MapView tworzona jest i opisywana całkowicie w kodzie Java, to klucz ten należy podać jako argument konstruktora. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.google.android.maps.mapview android:id="@+id/mapa" </LinearLayout> android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apikey="xxx" /> możliwość przesuwanie mapy (dla wartości false możliwe jest jedynie przybliżanie i oddalanie widoku) tu należy wprowadzić klucz interfejsu API dla mapy (Maps API Key)

Strona 7 Metody klasy MapView Wygląd wyświetlanej mapy można ustalać następującymi metodami: metoda MapController getcontroller() getcontroller().zoomin() getcontroller().zoomout() getcontroller().setzoom(int) getcontroller().setcenter(geopoint) setsatellite(boolean) setstreetview(boolean) settraffic(boolean) setclickable(boolean) setbuiltinzoomcontrols(boolean) przeznaczenie pobranie kontrolera mapy przybliżenie widoku mapy oddalenie widoku mapy ustalenie przybliżenia widoku (wartość 1 21) centrum widoku to współrzędne obiektu kl. GeoPoint wyświetlanie mapy w trybie widoku z satelity (zdjęcia satelitarne) wyświetlanie mapy w trybie widoku ulic (obrys ulic w kolorze niebieskim) wyświetlanie mapy w trybie ruchu ulicznego (kolorowe linie oznaczają ulice łatwo przejezdne i zakorkowane ) możliwość przesuwania mapy umieszczenie na mapie standardowych kontrolek minus i plus do oddalania i przybliżania widoku mapy

Strona 8 Wyświetlanie mapy Aktywność używająca kontrolki MapView musi dziedziczyć po klasie MapActivity. public class Mapa extends MapActivity private MapView mv; protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); mv = (MapView) findviewbyid(r.id.mapa); protected boolean islocationdisplayed() return false; // położenie geograficzne nie jest wyświetlane protected boolean isroutedisplayed() return false; // wyznaczana trasa nie jest wyświetlana

Strona 9 Wyświetlanie mapy uprawnienia aplikacji Dane do wyświetlania mapy pochodzą z serwera usługi Google Maps, dlatego wymagane jest nadania dla aplikacji odpowiedniego uprawnienia do łączenia się z Internetem. Uzyskanie informacji geolokalizacyjnych wymaga z kolei nadania dla aplikacji dwóch kolejnych uprawnień. Konieczne jest również zadeklarowanie w manifeście aplikacji użycia biblioteki com.google.android.maps. <?xml version="1.0" encoding="utf-8"?> <manifest Wymagane uprawnienia... <application... <uses-library android:name="com.google.android.maps" /> </application> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" />... </manifest>

Strona 10 Dodawanie własnych danych do mapy Usługa Google Maps umożliwia umieszczanie na wyświetlanej mapie warstwy (tzw. nakładki) zawierającej dodatkowe informacje. Mogą to być np. lokalizacje punktów widoczne jako znaczniki w postaci obrazków. Do obsługi warstwy mapy z dodatkowymi informacjami służą klasy-nakładki Overlay i ItemizedOverlay. Dodatkowe dane dla mapy należy zdefiniować w obiekcie klasy pochodnej po ItemizedOverlay. protected Oto zmodyfikowana void oncreate(bundle w tym celu metoda savedinstancestate) oncreate: super.oncreate(savedinstancestate); setcontentview(r.layout.main); mv = (MapView) findviewbyid(r.id.mapa); identyfikator obrazka z katalogu /res/drawable rysowanego jako znacznik na mapie Drawable znacznik = getresources().getdrawable(r.drawable.marker); znacznik.setbounds(0, 0, znacznik.getintrinsicwidth(), znacznik.getintrinsicheight()); NaszeLokalizacje miejsca = new NaszeLokalizacje(znacznik); mv.getoverlays().add(miejsca); GeoPoint punkt = miejsca.getcenter(); mv.getcontroller().setcenter(punkt); mv.getcontroller().setzoom(15); pierwszy punkt jako środek mapy obiekt klasy definiującej lokalizacje na mapie otrzymuje obrazek dla znaczników dodanie warstwy do mapy

Strona 11 Dodawanie własnych danych do mapy (c.d.) class NaszeLokalizacje extends ItemizedOverlay kontener lokalizacji (lokalizacje na mapie to obiekty OverlayItem) private List<OverlayItem> lokalizacje = new ArrayList<OverlayItem>(); private Drawable marker; public NaszeLokalizacje(Drawable marker) super(marker); this.marker = marker; GeoPoint miejsce1 = new GeoPoint(54190278, 16181667); lokalizacje.add(new OverlayItem(miejsce1, Miejsce1, Miejsce1 ); populate(); zapis kontenera do pamięci podręcznej public void draw(canvas canvas, MapView mapview, boolean shadow) super.draw(canvas, mapview, shadow); boundcenterbottom(marker); dodanie lokalizacji do kontenera tworzenie lokalizacji jako obiektu klasy GeoPoint (szer. i dług. geograficzna w mikrostopniach) Na tej samej zasadzie można utworzyć kolejne lokalizacje: miejsce2, miejsce3 itd. zakotwiczenie obrazka znacznika względem punktu na mapie (tutaj środek dolnej krawędzi obrazka) protected OverlayItem createitem(int i) return lokalizacje.get(i); protected int size() return lokalizacje.size();

Strona 12 Położenie geograficzne Pakiet android.location zawiera trzy elementy istotne z punktu widzenia określania położenia geograficznego: klasa GeoPoint obiekt tej klasy określa położenie geograficzne w postaci pary współrzędnych: długości geograficznej (ang. longitute) i szerokości geograficznej (ang. latitude). Parametrami konstruktora są długość i szerokość wyrażone w mikrostopniach (pomnożone przez 1 000 000) i zrzutowane na typ int. np. Koszalin 54 11 25 N 16 10 54 E (DMS: stopnie, min, sek) szerokość 54.190278 (DMF: stopnie setne) długość 16.181667 GeoPoint((int) (54.190278*1e6), (int) (16.181667*1e6)) klasa Geocoder obiekt tej klasy (tzw. geokoder) służy do geokodowania (geolokalizacji), czyli konwersji pomiędzy adresem miejsca, a współrzędnymi geograficznymi. Możliwa jest konwersja w obie strony. usługa LocationManager umożliwia określenie bieżącego położenia urządzenia mobilnego.

Strona 13 Klasa Geocoder Metody klasy Geocoder (zwracają listę adresów pasujących do argumentów): List<Address> getfromlocation(double latitude, double longitude, int maxresults) konwertuje współrzędne geograficzne na listę odpowiadających im adresów List<Address> getfromlocation(string locationname, int maxresults) konwertuje adres na listę odpowiadających im współrzędnych List<Address> getfromlocationname(string locationname, int maxresults, double lowerleftlatitude, double lowerleftlongitude, double upperrightlatitude, double upperrightlongitude) konwertuje adres na listę współrzędnych latitude longitude maxresults szerokość geograficzna długość geograficzna prostokątne otoczenie adresu (miejsca) maksymalna liczba wyników 1 5 (ograniczenie) locationname adres, nazwa miejsca lub nazwa zwyczajowa geokodowanie odwrotne geokodowanie

Strona 14 Przykład geokodowania public class Mapa extends MapActivity private MapView mv = null; private Geocoder gc = null; private List<Address> adresy = null; protected boolean islocationdisplayed() return false; // położenie geograficzne nie jest wyświetlane protected boolean isroutedisplayed() return false; // wyznaczana trasa nie jest wyświetlana protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); mv = (MapView) findviewbyid(r.id.mapa); //...

Strona 15 Przykład geokodowania (c.d.) int szer = (int)(54.190278*1e6); // latitude int dlug = (int)(16.181667*1e6); // longitude GeoPoint gp = new GeoPoint(szer, dlug); mv.getcontroller().setcenter(gp); mv.getcontroller().setzoom(10); gc = new Geocoder(this); try String nazwa = Politechnika Koszalińska ; adresy = gc.getfromlocationname(nazwa, 5); if (adresy!= null && adresy.size() > 0) szer = (int) (adresy.get(0).getlatitude()*1e6); dlug = (int) (adresy.get(0).getlongitude()*1e6); gp = new GeoPoint(szer, dlug); mv.getcontroller().setcenter(gp); mv.getcontroller().setzoom(10); catch (IOException e) // koniec metody oncreate // koniec klasy Mapa nazwa miejsca, lokalizacji zwrócona lista adresów przetwarzanie pierwszego adresu z listy zaktualizowanie mapy o wynik geokodowania

Strona 16 Geokodowanie w tle Zalecane jest przeprowadzanie geokodowania w wątku innym niż wątek interfejsu użytkownika (metoda oncreate), ponieważ: geokodowanie może być procesem czasochłonnym i powodować przestoje w interfejsie użytkownika, połączenie sieciowe wymagane do geokodowania może zostać nieoczekiwanie przerwane. Należy kolejno: w interfejsie użytkownika zainicjować czynność geokodowania, utworzyć i uruchomić wątek przeznaczony do geokodowania, po zakończeniu wątku poinformować interfejs użytkownika o konieczności jego aktualizacji lub wysłać powiadomienie.

Strona 17 Przykład geokodowania w tle int szer = (int)(54.190278*1e6); // latitude int dlug = (int)(16.181667*1e6); // longitude GeoPoint gp = new GeoPoint(szer, dlug); mv.getcontroller().setcenter(gp); mv.getcontroller().setzoom(10); gc = new Geocoder(this); String nazwa = Politechnika Koszalińska ; ProgressDialog pd = ProgressDialog.show(Activity.this, Geokodowanie..., Szukanie lokalizacji..., true, false); szukaj_lokalizacji(nazwa); fragment zmienionej metody oncreate ze str. 94 nazwa miejsca, lokalizacji okno dialogowe postępu private void szukaj_lokalizacji(final String s) Thread t = new Thread() utworzenie wątku public void run() geokodowanie w tle try adresy = gc.getfromlocationname(s, 5); uicallback.sendemptymessage(0); catch (IOException e) wysłanie komunikatu do procedury ; obsługi zdarzeń w celu przetworzenia t.start(); uruchomienie wątku wyników geokodowania

Strona 18 Przykład geokodowania w tle (c.d.) private Handler uicallback = new Handler() public void handlemessage(message msg) ; usunięcie okna dialogowego postępu pd.dismiss(); if (adresy!= null && adresy.size() > 0) int szer = (int) (adresy.get(0).getlatitude()*1e6); int dlug = (int) (adresy.get(0).getlongitude()*1e6); GeoPoint gp = new GeoPoint(szer, dlug); else mv.getcontroller().setcenter(gp); mv.getcontroller().setzoom(10); zaktualizowanie mapy o wynik geokodowania Procedura obsługi wywołania zwrotnego w wątku interfejsu użytkownika przetwarzanie pierwszego adresu z listy Toast toast = Toast.makeText(Activity.this, Nie znaleziono lokalizacji, Toast.LENGTH_LONG); toast.show();

Strona 19 Usługa LocationManager Usługa LocationManager z pakietu android.location umożliwia: uzyskanie współrzędnych geograficznych urządzenia mobilnego, poinformowanie za pomocą intencji o znalezieniu się urządzenia mobilnego w określonym obszarze geograficznym. Usługa LocationManager to usługa systemowa, dlatego nie jest tworzona bezpośrednio należy uzyskać do niej dostęp z kontekstu metodą getsystemservice wykorzystując nazwę usługi. Informacje o położeniu geograficznym dostarczane są poprzez tzw. dostawców lokacji. Wyróżnia się: dostawców lokacji systemu GPS (LocationManager.GPS_PROVIDER) : położenie określane jest przy użyciu systemu satelitarnego GPS, sieciowych dostawców lokacji (LocationManager.NETWORK_PROVIDER): położenie określane jest w oparciu o stacje bazowe operatorów sieci GSM lub sieci bezprzewodowe Wi-Fi.

Strona 20 Wzorzec użycia usługi LocationManager public class LocationManagerTest extends Activity protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); LocationManager lm; nazwa usługi lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); Location lok = lm.getlastknownlocation(locationmanager.gps_provider); List<String> lista = lm.getallproviders(); String dostawca = lm.getprovider(locationmanager.gps_provider); Obiekt lok zawiera następujące dane: szerokość geograficzna długość geograficzna data ostatniej aktualizacji położenia wysokość n.p.m. prędkość opcjonalnie peleng lista wszystkich dostawców lokacji uzyskanie wybranego dostawcy lokacji uzyskanie dostępu do usługi systemowej informacje dotyczące ostatniej znanej pozycji urządzenia nazwa dostawcy lokacji: GPS_PROVIDER lub NETWORK_PROVIDER

Strona 21 Nasłuch zmian położenia geograficznego Implementacja obiektu nasłuchiwacza zmian położenia geograficznego: public class LocationManagerTest extends Activity protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); nazwa usługi LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); LocationListener loclis = new LocationListener() public void onlocationchanged(location loc) if (loc!= null) nowe położenie Toast.makeText(getBaseContext(), Nowe współrzędne: szer + loc.getlatidude() +, dlug + loc.getlongitude(),toast.length_short).show(); public void onproviderdisabled(string provider) public void onproviderenabled(string provider) public void onstatuschanged(string provider, int status, Bundle extras) ; lm.requestlocationupdates(locationmanager.gps_provider, 0, 0, loclis); Do działania konieczne jest okresowe przesyłanie do emulatora informacji o położeniu. metoda nasłuchiwacza wołana po zmianie położenia geograficznego zarejestrowanie nasłuchiwacza odbierającego zdarzenia aktualizacji położenia nazwa dostawcy lokacji, mintime w ms, mindistance w m, zerowe => informacje o położeniu przesyłane jak najczęściej

Strona 22 Symulacja zmian położenia geograficznego w emulatorze Symulowane wartości współrzędnych geograficznych można przesłać do emulatora za pomocą monitora sprawdzania błędów maszyny wirtualnej DDMS (Dalvik Debug Monitor Service) dostępnego w środowisku Eclipse. Należy w tym celu w perspektywie DDMS, w oknie Emulator Control przejść do sekcji Location Controls i wybrać zakładkę Manual (str. 103). Wprowadzenie współrzędnych geograficznych (str. 103) i kliknięcie przycisku Send spowoduje automatyczne uruchomienie metody onlocationchanged (str. 101) reagującej w nasłuchiwaczu na zmianę położenia geograficznego. Możliwe jest również zautomatyzowanie procesu symulacji zmian położenia geograficznego. W zakładkach Emulator Control GPX i KML (str. 104) możliwe jest wczytanie plików GPX lub KML zawierających zestaw współrzędnych i skonfigurować szybkość odtwarzania danych z tych plików.

Strona 23 Okno środowiska Eclipse do symulacji odczytu położenia geograficznego z GPS symulowana długość geograficzna symulowana szerokość geograficzna przycisk wysyłający współrzędne do emulatora

Strona 24 Okna środowiska Eclipse do symulacji zmian położenia geograficznego okno do obsługi plików w formacie GPX (GPS Exchange Format) okno do obsługi plików w formacie KML (Keyhole Markup Language)

Strona 25 Klasa MyLocationOverlay Istnieje możliwość zaznaczania na wyświetlanej mapie bieżącego położenia urządzenia mobilnego w postaci niebieskiego, pulsującego kółka. Umożliwia to nakładka MyLocationOverlay dodawana do widoku mapy MapView. Bieżące położenie jest oczywiście wyznaczane przez usługę LocationManager. public class Mapa extends MapActivity private MapView mv = null; private MapController mc = null; private MyLocationOverlay mlo = null; public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); mv = (MapView) findviewbyid(r.id.mapa); mc = mv.getcontroller(); mc.setzoom(15); mlo = new MyLocationOverlay(this, mv); mv.getoverlays().add(mlo); mv.postinvalidate(); //... tworzenie nakładki MyLocationOverlay dodanie nakładki do widoku mapy odświeżenie mapy (wyświetlenie nakładki)

Strona 26 //... Wykorzystanie klasy MyLocationOverlay protected boolean islocationdisplayed() return mlo.ismylocationenabled; protected boolean isroutedisplayed() return false; // trasa nie wyświetlana public void onresume() super.onresume(); mlo.enablemylocation(); mlo.runonfirstfix(new Runnable() public void run() mc.setcenter(mlo.getmylocation()); ); public void onpause() super.onpause(); mlo.disablemylocation(); metoda zwraca true gdy położenie geograficzne jest wyświetlane metoda wywoływana po uruchomieniu aplikacji i po wyjściu ze stanu wstrzymania (pauzy): WŁĄCZONE pobieranie położenia metoda runonfirstfix umożliwia zdefiniowanie czynności wykonywanych zaraz po otrzymaniu współrzędnych położenia: tutaj jest to wyśrodkowanie mapy metoda wywoływana po przejściu w stan wstrzymania (pauzy): WYŁĄCZONE pobieranie położenia

Strona 27 Zdarzenia dotyku na mapie Do wbudowanych funkcji map sterowanych dotykiem należą: przybliżanie i oddalanie widoku mapy, przesuwanie mapy. Możliwe jest również definiowanie własnych czynności wykonywanych w reakcji na dotyk mapy. Klasa MapView dziedziczy po klasie View posiada zatem metodę ontouchevent() obsługującą zdarzenia dotyku. Metodę tę posiadają również nakładki (warstwy mapy): Overlay, ItemizedOverlay i MyLocationOverlay. Sposoby obsługi zdarzeń dotyku na mapie: przesłonienie metody ontouchevent() ontouchevent(motionevent e) dla mapy ontouchevent(motionevent e, MapView mv) dla nakładki użycie metody setontouchlistener() do zdefiniowania metody obsługi wywołań zwrotnych reagujących na dotyk.

Strona 28 Metody obsługi zdarzeń dotyku na mapie Użyteczny jest interfejs Projection klasy MapView, który pozwala konwertować współrzędne ekranowe punktu dotkniętego na mapie na współrzędne geograficzne mapy (obiekt GeoPoint) i odwrotnie. Wybrane metody interfejsu Projection: getprojection() pobranie interfejsu mapy MapView, frompixels() konwersja wsp. ekranowych mapy na geograficzne, topixels() konwersja wsp. geograficznych mapy na ekranowe. W przypadku dodatkowych warstw mapy (nakładek Overlay) przeliczanie takie nie jest konieczne zajmuje się tym metoda ontap klasy Overlay. boolean ontap(geopoint p, MapView mv) Metoda ontap jest wywoływana automatycznie po dotknięciu nakładki (warstwy mapy) obiekt klasy GeoPoint zawiera współrzędne geograficzne dotkniętego na mapie punktu.

Strona 29 Przykład obsługi zdarzeń dotyku na mapie Wyświetlanie współrzędnych geograficznych miejsca dotkniętego na mapie. public class Mapa extends MapActivity private MapView mv; protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); mv = (MapView) findviewbyid(r.id.mapa); NaszTouchOverlay nakladka = new NaszTouchOverlay(this); mv.getoverlays().add(nakladka); protected boolean islocationdisplayed() obiekt nakładki z obsługą dotyku dodanie nakładki do mapy return false; // położenie geograficzne nie jest wyświetlane protected boolean isroutedisplayed() return false; // wyznaczana trasa nie jest wyświetlana

Strona 30 Przykład obsługi zdarzeń dotyku na mapie (c.d.) Wyświetlanie współrzędnych geograficznych miejsca dotkniętego na mapie. public class NaszTouchOverlay extends Overlay private Context c; public NaszTouchOverlay(Context context) c = context; public boolean ontap(geopoint gp, MapView mapview) // dotknięto mapę w punkcie o współrzędnych geograficznych gp Toast toast = Toast.makeText(c, szer + gp.getlatitudee6()/1e6 +, dlug + gp.getlongitudee6()/1e6, Toast.LENGTH_LONG); toast.show(); return true;