piątek, lutego 19, 2010

GPS

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.

Brak komentarzy:

Publikowanie komentarza