Programowanie urządzeń mobilnych projekt 6 (05.01.2018) Usługi lokalizacyjne Jedną z powszechniejszych funkcjonalności wykorzystywanych przez liczne aplikacje przeznaczone dla urządzeń mobilnych jest możliwość określenia lokalizacji (współrzędnych GPS) danego urządzenia. Poniżej zaprezentowano przykład, w którym aplikacja będzie wyświetlać aktualne położenie urządzenia w postaci współrzędnych GPS. Aby było to możliwe konieczne jest zmodyfikowanie pliku AndroidManifest.xml W wierszu 4 dodano wiersz, dzięki któremu aplikacja uzyskuje uprawnienia do korzystania z usług lokalizacyjnych, co w praktyce oznacza dostęp do danych zwracanych przez moduł GPS (ACCESS_FINE_LOCATION). To uprawnianie może ograniczać się tylko do lokalizacji w oparciu o usługi sieci GSM lub w oparaciu o GPS jak w opisywanym przypadku.
1. Wiersz 20 - wykorzystanie tzw. usług systemowych jako podstawy do utworzenia obiektu klasy LocationMenager. Będzie on reagował na zmianę wartości długości i szerokości geograficznej wykrytą przez moduł GPS 2. Wiersz 21 - obiekt klasy LocationListener, którego zadaniem jest obsługa zmian w statusie modułu GPS wykrywanych przez obiekt klasy LocationMenager. Wywołanie konstruktora klasy LocationListener powoduje, iż Android Studio automatycznie generuje 4 puste metody przeznaczone do obsługi zmian statusu położenia. 3. wiersz 39 - wypełniamy metodę onlocationchanged kodem, który realizowany ma być w momencie zmiany współrzędnych szerokości i długości geograficznej. 4. Wiersz 41, 42 - w oparciu o dane przechowywane w obiekcie location odczytujemy odpowiedni długość i szerokość geograficzną, a następnie aktualizujemy tekst wyświetlany w aktywności głównej aplikacji. 5. Wiersz 49 - dowiązanie do Menadzeraaktualizacji obiektu, który będzie reagował na zmiany w statusie usług lokalizacyjnych. Warto zwrócić uwagę, że android studio ostrzega w tym przypadku (czerwone podkreślenie), iż następuje wykorzystanie usług lokalizacyjnych bez weryfikacji, czy moduł GPS jest włączony, oraz czy użytkownik udział aplikacji odpowiednich uprawnień (zrezygnowano z tego dla przejrzystości przykładu). O ile w przypadku korzystania z urządzenia rzeczywistego w łatwy sposób można zweryfikować poprawność działania powyższego przykładu, tak w przypadku korzystania z emulatora koniecznym jest odwołanie się do ustawień emulatora ( przycisk [ ]), gdzie istniej możliwość "ręcznej" symulacji zmiany położenia:
W efekcie aplikacja wyświetlić powinna: Komunikacja klient - serwer Dobrym przykładem aby zaprezentować ten aspekt jest pobranie np. strony internetowej z wybranego serwera WWW. Dla uproszczenia przykładu aplikacja będzie ograniczać się do wyświetlenia statusu połączenia oraz pobrania i wyświetlenia w okienku logu środowiska Android Studio kodu HTML pobranej strony: Podobnie jak w przypadku wykorzystywani usług lokalizacyjnych koniecznym jest udzielenie uprawnień specjalnych dla aplikacji, tym razem niezbędnych do komunikacji z Internetem. Podobnie jak w tamtym przypadku należy dodać stosowne uprawnienie do pliku Android Manifest (patrz wiersz nr 7 poniżej):
Kod realizujący opisane wyżej funkcjonalności zaprezentowano poniżej:
1. Wiersz 28 - metoda wywoływana przez przycisk na aktywności głownej 2. Wiersz 30 - wywołanie konstruktora dodatkowej klasy PobierzStatusPołączenia i jednocześnie wywołanie metody execute() z parametrem zawierającym adres pobieranej strony Internetowej. Wywołanie execute() skutkuje automatycznym wywołaniem metody doinbackground() z szablonu AsyncTask. 3. Wiersz 32 - nowa klasa pochodna od klasy AsyncTask - rozwiązanie umożliwia asynchroniczne wykonywanie zadań w niezależnym wątku. Przy odwołaniu do szablonu AsyncTask, zostaje automatycznie utworzona metoda doinbackground(); Metoda ta jest wywoływana automatycznie w momencie żądania metody execute() - patrz wyżej. 4. Wiersz 38 - wywołanie metody PobierzURL z paramaterem zawierjącym adres żądanej strony Internetowej. 5. Wiersz 45 - nowy obiekt klasy URL utworzony dla adresu żądanej strony. 6. Wiersz 46 - obiekt klasy HttpURLConnection utworzony w oparciu o efekt wywołania openconnetion() dla obiektu klasy URL. 7. Wiersz 47 - próba nawiązania połączenia ze wskazanym adresem.
8. Wiersz 48 - pobranie kodu odpowiedzi 9. Wiersze 49, 50 - bufor pomocniczy oraz jego obsługa na potrzebę pobierania danych w utworzonego wcześniej połączenia. 10. Wiersz 53 - pętla pobierające wszystkie wiersze zwrócone przez serwer i wypisująca je do logu monitora Android Studio. 11. Wiersz 60 - metoda automatycznie wywoływana po zakończeniu realizacji metody doinbackground z parametrem przez nią zwróconym - wyświetla na aktywności kod statusu połączenia. W efekcie wykonania powyższego kodu np. dla strony witryny www.wp.pl można uzyskać: Zadania Zadanie 1 (7 pkt) Przygotuj aplikację, która w oparciu o dane zgromadzone w bazie SQLite będzie wyświetlała na ekranie jakiś opis miejsca w jakim w danym momencie znajduje się użytkownik telefonu (dane z GPS). Poziom dopasowania (odległość do punktu z bazy danych) ustala użytkownik. Proszę przygotować bazę z kilkoma różnymi lokalizacjami. Zadanie 2 (10 pkt) Rozbuduj program z zadania nr 1 tak aby aplikacja na Android współpracowała z serwisem www (napisanym np. w PHP). Współpraca polegać ma na tym, iż w przypadku, gdy punkt w którym znajduje się w danym momencie urządzanie, nie ma opisu w bazie danych, to aplikacja pobiera te dane z serwera (HTTP), uzupełnia swoją bazę danych i ostatecznie wyświetla opis użytkownikowi. Oczywiście aplikacja pobiera z serwera tylko dane dotyczące konkretnego punktu. Zadanie 3 (15 pkt) 1. Podobnie jak w zadaniu z listy 5 proszę dokonać szczegółowej analizy, opisać oraz "spolszczyć" przykład dodany jako załącznik (przykład jest "w oryginale" pobrany ze strony autora: http://kvenkataprasad.blogspot.com/2015/01/xml-parser-example-using-dom-and-
sax.html) - przykład pobiera z serwera zewnętrznego plik XML, a następnie wyświetla zgromadzone tam dane. Realizuje to w oparciu o analizę DOM lub bazując na SAX. 2. W oparciu o powyższy przykład należy zrealizować aplikację, która umożliwi podanie nazwy miasta a następnie w oparciu o usługę http://openweathermap.org/current wygeneruje informację o aktualnej pogodzie w tym mieście (należy się zarejestrować i wygenerować klucz API). Należy zadbać o oprawę graficzną aplikacji.