Praktycznie każdy bardziej zaawansowany telefon, lub każdy, nawet najgłupszy smartfon jest wyposażony w kostkę pozwalającą na korzystanie z dobrodziejstw systemu GPS.
Dowiedzmy się zatem, jak można dobrać się do danych o naszym położeniu, w prostej aplikacji, pokazującej nam gdzie aktualnie się znajdujemy.
Pierwsze co musimy zrobić, to uzyskać dostęp do klasy
LocationProvider, klasa ta wystawia jedną metodę, getLocationProvider. Funkcję tę należy nakarmić kryterium, w którym definiujemy wymaganą dokładność. W tym przykładzie, nie potrzebujemy informacji na temat wysokości oraz prędkości i kierunku (przydatne gdy chcemy stworzyć coś na kształt nawigacji, albo trackera).
Criteria cr = new Criteria();
cr.setAddressInfoRequired(false);
cr.setAltitudeRequired(false);
cr.setPreferredResponseTime
(Criteria.NO_REQUIREMENT);
cr.setSpeedAndCourseRequired(false);
cr.setCostAllowed(true);
cr.setHorizontalAccuracy
(Criteria.NO_REQUIREMENT);
cr.setPreferredPowerConsumption
(Criteria.NO_REQUIREMENT);
cr.setVerticalAccuracy
(Criteria.NO_REQUIREMENT);
LocationProvider lp =
LocationProvider.getInstance(cr);
Gdy usługa ta jest niedostępna albo wyłączona, funkcja ta zwróci nam null, który musimy ładnie obsłużyć, musimy też uważać na wyjątki - no ale to jest chyba dla wszystkich oczywiste. Obsługę i pobieranie danych należy zepchnąć na wątek chodzący w tle, próba pobrania lokalizacji z wnętrze dystrybutora zdarzeń (event dispatcher) spowoduje wygenerowanie wyjątku, gdyż aplikacja nie zezwoli nam się zablokować na tak długi czas (czas oczekiwania na synchronizację z danymi satelitarnymi może być baaardzo długi).
Location location = lp.getLocation(180);
if (location.isValid()) {
Coordinates c =
location.getQualifiedCoordinates();
if (c != null) {
double latitude = c.getLatitude();
double longitude = c.getLongitude();
// przetwórz otrzymane dane
}
}
W wyniku tych akcji otrzymamy suche dane, które użytkownikowi nic nie mówią. Zamienimy je w podgląd terenu pobrany z pomocą
Google Maps API (wersja statyczna). W ten sam sposób stworzono ten obrazek, który jest generowany na żądanie przez serwery Google, w sposób określony adresem URL:
http://maps.google.com/maps/api/\
staticmap?center=49.232611,20.015083\
&size=200x200&maptype=terrain\
&sensor=true&zoom=15\
&markers=size:mid|49.232611,20.015083
Zbieramy wszystko do kupy i w wyniku otrzymujemy taką oto zgrabną aplikacyjkę, które nie ma większego praktycznego sensu, jednak jako demonstracja zupełnie wystarczy.
Kilka uwag:
- jeśli ustawiasz obserwatora na zdarzenia zmiany lokacji to obsłuż również zdarzenie zmiany dostawcy lokalizacji - może nagle zniknąć
- obsłuż zdarzenie odebrania rozmowy - po jej zakończeniu od nowa ustaw obserwatora na zmiany lokalizacji
Kod źródłowy aplikacji jest dostępny o
tutaj.