Chciałbym dodać do mojej aplikacji powiadomienia które pojawią się kiedy użytkownik będzie w danej lokalizacji. Na przykład ‘kiedy będę w domu przypomnij mi żeby poczytać’. Żeby to zrobić potrzebne będą 2 rzeczy:

  1. interfejs który pomoże wybrać miejsce przypomnienia
  2. serwis który będzie śledził lokalizację użytkownika

Punkt pierwszy będzie bardzo prosty do wykonania za pomocą API Google Maps i Google Places, więc tym się dzisiaj zajmiemy.

Pierwszą rzeczą jaką należy zrobić to uzyskanie klucza API. Robimy to tutaj lub tutaj. Nie ma znaczenia z którego miejsca weźmiemy klucz, albowiem w AndroidManifest.xml dodajemy tylko jedną wartość dla obu API. Umieszczamy więc tag meta-data wewnątrz tagu application.

Poza kluczem API musimy jeszcze dodać uprawnienia które będą potrzebne do prawidłowego działania aplikacji.

Dodajemy teraz zależności do build.gradle. W momencie pisania tego artykułu najnowsza wersja Google Play Services to 10.2.4, a najnowsze zależności można znaleźć tutaj.

Tworzymy teraz nową aktywność która będzie rozszerzała FragmentActivity zamiast AppCompatActivity oraz implementowała OnMapReadyCallback ActivityCompat.OnRequestPermissionsResultCallback. W layout’cie tej aktywności tworzymy dwa fragmenty. Pierwszy z nich to będzie pasek wyszukiwania lokalizacji. Natomiast drugi będzie mapą.

Zajmijmy się najpierw mapą .Tworzymy dwie prywatne zmienne: position – czyli pozycję wskaźnika na mapie wyrażoną w długości i szerokości geograficznej oraz mapFragment który jest obiektem reprezentującym mapę.

Następnie w metodzie onCreate() przypisujemy wartość do mapFragment a następnie wywołujemy metodę getMapAsync(). Metoda ta ustala jaki obiekt OnMapReadyCallback ma zostać wywołany gdy mapa będzie gotowa bo użycia. Zaimplementowaliśmy wcześniej ten interfejs więc podajemy aktywność jako argument.

Po tym jak mapa jest gotowa do użycia wywoływana jest metoda onMapReady(). Możemy w niej ustawić rzeczy takie jak znaczniki lub to co dzieje się po kliknięciu na mapę. W tym wypadku ważny jest  element metody który zaznacza na mapie obecną lokalizację użytkownika. Zawiera się on w instrukcji googleMap.setMyLocationEnabled(true), jest ona jednak otoczona całą masą kodu. Kod ten służy do sprawdzenia czy aplikacja posiada odpowiednie uprawnienia. Przed wydaniem Androida w wersji 6.0 Marshmallow sprawa była prosta, albo te uprawnienia były zdefiniowane w AndroidManifest.xml albo nie. Jednak od czasu wydania tej wersji kiedy aplikacja chce skorzystać z konkretnych uprawnień wyświetla okienko dialogowe które poprosi o te uprawnienia. Sprawdzamy więc czy wersja Androida zainstalowana na urządzeniu jest większa lub równa Androidowi Marshmallow. Jeżeli tak to sprawdzamy czy odpowiednie uprawnienia zostały już przyznane i jeżeli nie prosimy o nie.

Po wywołaniu metody requestPermissions() zostanie wywołana jeszcze jedna metoda. Mianowicie onRequestPermissionsResult() przeciążamy ją po zaimplementowaniu ActivityCompat.OnRequestPermissionsResultCallback, a wewnątrz niej sprawdzamy czy uprawnienia zostały przypisane i jeżeli zostały to na nowo łasujemy mapę.

Zajmijmy się teraz konfiguracją Places API. W naszym przypadku będzie ona bardzo prosta. Najpierw przypisujemy odpowiedni fragment do obiektu PlaceAutocompleteFragment, a następnie przypisujemy do niego Listener. Gdy miejsce zostanie wybrane przez użytkownika do wcześniej przygotowanej zmiennej position zostanie przypisana nowa wartość, a na mapie pojawi się nowy znacznik.

Podziel się z innymi!Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter