Komme i gang med Google Maps for Android Grunnleggende

Introduksjon

Uten tvil er kart et av de mest nyttige verktøyene for brukere når de er inkludert i en app. Denne opplæringen er den første i en serie som går over Google Maps v2 for Android. Den vil dekke oppsett av Google Maps-API via Google Developer Console, inkludert et kartfragment i programmene dine, vise brukerens plassering, legge til markører, tegne på kartet og noen generelle metoder som vil legge til verktøy i appen din. All kode for denne opplæringen finner du på GitHub.

1. Sette opp utviklerkonsollen

For å kunne bruke Google Maps API må du registrere søknaden din på Google Developer Console og aktiver API. For å gjøre dette, starter du med å gå til Google Developer Console. Hvis du allerede har et prosjekt opprettet, kan du hoppe over neste avsnitt. Hvis ikke, kan du følge med og opprette et nytt prosjekt for kartapplikasjonen.

Trinn 1: Opprette et prosjekt

For å opprette et nytt prosjekt, klikk på det blå Opprett prosjekt knappen øverst til venstre på skjermen. Hvis du ikke ser en Opprett prosjekt knappen, så se etter en knapp merket Lag et tomt prosjekt.

Dette gir deg en dialog som ber om et prosjektnavn. For denne opplæringen har jeg opprettet et prosjekt som heter TutsPlusMaps. Det er noen begrensninger på hva du kan navngi prosjektet ditt, da bare bokstaver, tall, sitater, bindestreker, mellomrom og utropstegn er tillatt tegn.

Når du treffer Skape, en dialogboks vises nederst til høyre på siden med en lastindikator mens prosjektet blir opprettet.

Trinn 2: Aktiverer Maps API

Når prosjektet er opprettet, eller du har valgt et eksisterende prosjekt, blir du tatt med til prosjektet Oversikt skjerm. Herfra vil du ønsker å utvide APIer og auth element i venstre navigasjonspanel og klikk på APIer.

Mens det er en søkeboks på denne skjermen, vil du legge merke til at Google plasserte Maps API-elementene øverst i senterkolonnen for utviklere å få tilgang til. For denne opplæringen, klikk på elementet med tittelen Google Maps Android API under Google Maps APIer overskrift.

Dette tar deg til en skjerm hvor du kan klikke på det blå Aktiver API knappen for å aktivere Maps API for prosjektet ditt.

Trinn 3: Opprette en Android API-nøkkel

Når du har aktivert Maps API, klikker du på legitimasjon element under APIer og auth i sidenavigasjonen for å få en nøkkel for å få tilgang til Maps API i søknaden din. Når du presenteres med legitimasjon dialogboksen, trykk på den blå Legg til legitimasjon knappen og velg API-nøkkel.

Siden dette er et Android-program, må du velge Android-nøkkel i den neste dialogboksen. Hvis du skulle lage den samme applikasjonen ved å bruke kart på forskjellige plattformer, kan du opprette en nøkkel for hver plattform.

På neste skjermbilde klikker du Legg til pakkenavn og fingeravtrykk. Dette gir to felt, en for å legge til en pakke navn og en annen for å legge til SHA1 fra din søknads signeringsnøkkel.

For denne opplæringen vil jeg bruke pakkenavnet com.tutsplus.mapsdemo. For å få SHA1-signaturen må du åpne en terminal eller kommandoprompt og navigere til plasseringen av søknadens signeringsnøkkel. Dette kan enten være utgivelsesnøkkelen eller debug.keystore. Du kan generere SHA1 med følgende kommando:

keytool -list -v -keystore debug.keystore

Når du har opprettet SHA1-tasten og tastet den inn i tekstfeltet, klikker du på det blå Skape knapp. Du blir deretter presentert med en dialogboks som inneholder API-nøkkelen du må legge til i Android-appen din for å få tilgang til Maps API.

2. Sette opp Android-prosjektet

På dette tidspunktet kan du opprette det første Android-prosjektet med det samme pakkenavnet som du brukte til å opprette API-nøkkelen. Når prosjektet ditt er opprettet, åpner du build.gradle fil. Du må importere Play Services-biblioteket for kart. I dette eksemplet må du også importere plasseringen av Play Services-biblioteket for å angi en startposisjon for kartet ditt. Legg følgende linjer i avhengig node av build.gradle fil.

kompilere 'com.google.android.gms: play-services-maps: 7.8.0' compile 'com.google.android.gms: play-services-location: 7.8.0'

Når du har importert bibliotekene dine, kan du lukke build.gradle og åpne din AndroidManifest.xml fil. Over applikasjon node, må du erklære at programmet bruker OpenGL ES 2.0 og definere tillatelsene som kreves av søknaden din.

Legg merke til at ACCESS_FINE_LOCATION Tillatelse er bare nødvendig for denne demoen for å få brukerens plassering for å definere hvor kartet skal opprinnelig vises. Hvis du har en kjent plassering i din egen app, er det ikke nødvendig å bruke brukerens plassering.

  

Innen applikasjon nod, må du legge til to deler metadata. Den første informerer programmet som Play Services brukes, og det andre binder Maps API-nøkkelen med programmet. I følgende kodestykke, @ Snor / google_api_key er en strengreferanse til nøkkelen fra Google Developer Console.

 

Når du er ferdig med å oppdatere AndroidManifest.xml, gå videre og lukk filen. Deretter må du opprette en ny Java-klasse, kalt MapFragment, som strekker seg SupportMapFragment. SupportMapFragment brukes her i stedet for com.google.android.gms.maps.MapFragment for å legge til bakoverkompatibilitet før API 12.

Hvis appen din ikke trenger å støtte enheter som kjører eldre versjoner av Android, er det greit å bruke com.google.android.gms.maps.MapFragment. Når du har opprettet basisfragmentet, må du implementere de seks grensesnittene som vi skal bruke for denne demoen.

offentlig klasse MapFragment utvider SupportMapFragment implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GoogleMap.OnInfoWindowClickListener, GoogleMap.OnMapLongClickListener, GoogleMap.OnMapClickListener, GoogleMap.OnMarkerClickListener 
  • ConnectionCallbacks og OnConnectionFailedListener er designet for å overvåke tilstanden til GoogleApiClient, som brukes i denne applikasjonen for å få brukerens nåværende posisjon.
  • OnInfoWindowClickListener utløses når brukeren klikker på informasjonsvinduet som dukker opp over en markør på kartet.
  • OnMapLongClickListener og OnMapClickListener utløses når brukeren enten tapper eller holder nede på en del av kartet.
  • OnMarkerClickListener kalles når brukeren klikker på en markør på kartet, som vanligvis også viser informasjonsvinduet for den markøren.

Når du blir bedt om det, klikker du på den røde lyspæren som vises ved siden av klassenavnet for å legge til metodene som kreves for disse grensesnittene.

Når du har det opprinnelige fragmentet bygget, må du la Hoved aktivitet vet at den skal bruke dette fragmentet. Åpen activity_main.xml fra ressursmappen din og endre den slik at den inneholder fragmentet som en visning.

  

Når du har oppdatert aktivitetsoppsettet ditt, bør du kunne kjøre programmet og se et kart over Jorden som er fullstendig zoomet ut og fokusert på breddegrad 0, lengde 0.

3. Initialisere kartet

Trinn 1: Deklarere karttyper

Tilbake til vår MapFragment klasse, må du definere noen globale verdier øverst i klassen for bruk i søknaden din.

privat GoogleApiClient mGoogleApiClient; privat sted mCurrentLocation; privat endelig int [] MAP_TYPES = GoogleMap.MAP_TYPE_SATELLITE, GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_TERRAIN, GoogleMap.MAP_TYPE_NONE; privat int curMapTypeIndex = 0;

Her mGoogleApiClient og mCurrentLocation brukes til å få brukerens plassering for å initialisere kartkameraet. MAP_TYPES og curMapTypeIndex brukes i prøvekoden for å bytte mellom forskjellige kartvisningstyper. Hver av karttyperne tjener en annen hensikt, så en eller flere kan være egnet for dine egne applikasjoner.

GoogleMap.MAP_TYPE_SATELLITE viser en satellittvisning av området uten gatenavn eller etiketter.

GoogleMap.MAP_TYPE_NORMAL viser et generisk kart med gatenavn og etiketter.

GoogleMap.MAP_TYPE_HYBRID kombinerer satellitt og normal modus, viser satellittbilder av et område med alle etiketter.

GoogleMap.MAP_TYPE_TERRAIN ligner på et vanlig kart, men teksturer legges til for å vise endringer i høyde i miljøet. Disse teksturer er mest synlige når kartet er vinklet med en tofinger dra.

GoogleMap.MAP_TYPE_NONE ligner på et normalt kart, men viser ingen merker eller farger for typen miljø i et område. Det gjør det mulig å vise trafikk og andre overlegg på kartet.

Trinn 2: Opprette API-klienten

Deretter må du opprette din GoogleApiClient og initiere Stedstjenester for å få brukerens nåværende posisjon. Som jeg nevnte tidligere, hvis du har et sett sted du vil vise fremfor å fokusere på brukeren, kan du hoppe over ved hjelp av Stedstjenester.

@Override public void onViewCreated (View view, Bundle savedInstanceState) super.onViewCreated (view, savedInstanceState); setHasOptionsMenu (true); mGoogleApiClient = ny GoogleApiClient.Builder (getActivity ()) .addConnectionCallbacks (denne) .addOnConnectionFailedListener (dette) .addApi (LocationServices.API) .build (); initListeners (); 

De initListeners Metoden binder grensesnittene du oppga øverst i klassen med Google Kart objekt assosiert med SupportMapFragment. Slik ser implementeringen ut:

private void initListeners () getMap (). setOnMarkerClickListener (dette); GetMap () setOnMapLongClickListener (dette).; getMap (). setOnInfoWindowClickListener (dette); GetMap () setOnMapClickListener (dette).; 

Du har kanskje lagt merke til at GoogleApiClient og lyttere er opprettet og bundet fra onViewCreated heller enn det typiske onCreate. Dette skyldes at Google Kart objektet er ikke initialisert når onCreate kalles, så vi må vente til visningen er helt opprettet før du prøver å ringe GetMap for å unngå a NullPointerException.

Trinn 3: Konfigurere kartet

Siden du vil sette opp kartkameraet etter at brukerens plassering er funnet gjennom Play Services, bruker vi livssyklusen for Play Services til å kjøre initialiseringen av kartet vårt. Du kan koble til GoogleApiClient i onStart. Når klienten har koblet til, kan du ta brukerens siste hentede sted og bruke det for å sikte på kartkameraet.

@Override public void onStart () super.onStart (); mGoogleApiClient.connect ();  @Override public void onStop () super.onStop (); hvis (mGoogleApiClient! = null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect ();  @ Overstyr offentlig tomgang onConnected (Bundle bundle) mCurrentLocation = LocationServices .FusedLocationApi .getLastLocation (mGoogleApiClient); initCamera (mCurrentLocation); 

initCamera Metode, du initierer kameraet og noen grunnleggende kartegenskaper. Du starter med å opprette en kameraposisjon objekt gjennom CameraPosition.Builder, med et mål satt for bredden og lengden på brukeren og et sett zoomnivå.

Tilt og bearing brukes her til standardverdiene for å illustrere at de er tilgjengelige alternativer. Når du har en kameraposisjon objekt, kan du animere kartkameraet til den posisjonen ved hjelp av CameraUpdateFactory.

privat tomt initCamera (plassering sted) CameraPosition position = CameraPosition.builder () .target (new LatLng (location.getLatitude (), location.getLongitude ())) .zoom (16f) .bearing (0.0f) .tilt f) .build (); getMap (). animateCamera (CameraUpdateFactory .newCameraPosition (posisjon), null); getMap (). setMapType (MAP_TYPES [curMapTypeIndex]); getMap (). setTrafficEnabled (true); getMap (). setMyLocationEnabled (true); getMap (). getUiSettings (). setZoomControlsEnabled (true); 

På slutten av denne metoden vil du legge merke til at de siste fire linjene angir noen egenskaper for kartet. Du angir karttypen, som beskrevet tidligere i denne opplæringen, og aktivere overføringer av levende trafikkflyt i de to første linjene. setMyLocationEnabled legger til en knapp i øverste høyre hjørne av MapFragment som automatisk flytter kameraet til brukerens plassering når du trykker på den.

Endelig ringer setZoomControlsEnabled legger + og - knapper nederst til høyre, slik at brukeren kan endre kartet zoomnivå uten å måtte bruke bevegelser. Det er noen flere interessante ting som du kan angi med UiSettings, slik som å legge til kompass eller deaktivere bevegelser, som du finner i Android referansedokumentasjonen.

4. Merking av steder

En av de mest brukte kartfunksjonene innebærer å indikere steder med markører. Siden en breddegrad og lengdegrad er nødvendig for å legge til en markør, må du bruke OnMapClickListener for å la brukeren velge et sted på kartet for å plassere en Marker gjenstand.

@Override public void onMapClick (LatLng latLng) MarkerOptions options = new MarkerOptions () .posisjon (latLng); options.title (getAddressFromLatLng (latLng)); options.icon (BitmapDescriptorFactory.defaultMarker ()); getMap (). addMarker (alternativer); 

Denne metoden skaper en generisk rød markør hvor brukeren har tappet. Ytterligere alternativer, for eksempel å sette en markør som trekkbar, kan stilles inn gjennom MarkerOptions gjenstand. Du finner flere attributter i den offisielle Android referansedokumentasjonen. Hvis du vil endre fargen på markøren, kan du ringe BitmapDescriptorFactory.defaultMarker når du legger til et ikon til MarkerOptions. De defaultMarker Metoden aksepterer en flyteverdi som definerer fargen. Fargetonen kan enten settes manuelt eller som en forhåndsdefinert statisk verdi fra BitmapDescriptorFactory. Det er verdt å merke seg at addMarker returnerer a Marker objekt, som kan lagres for manuelt å fjerne bestemte markører om nødvendig.

Hvis du vil unngå å bruke de generiske fargepinnene til dine plasseringsmarkører, kan du sette en bitmap som ikonet på MarkerOptions gjenstand. For å demonstrere dette overstyrer du onMapLongClick metode slik at den bruker appikonet fra ressursmappen som en Marker når brukeren trykker på kartet lenge.

@Override public void onMapLongClick (LatLng latLng) MarkerOptions options = new MarkerOptions () .posisjon (latLng); options.title (getAddressFromLatLng (latLng)); options.icon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.mipmap.ic_launcher))); getMap (). addMarker (alternativer); 

Du har sikkert lagt merke til at getAddressFromLatLng Metoden blir brukt i begge klikkmetoder. Dette er en hjelpemetode som tar en LatLng og kjører den gjennom a Geocoder for å få en gateadresse. I de to siste eksemplene bruker vi denne metoden til å vise en gateadresse når en markør er tappet.

Private String getAddressFromLatLng (LatLng latLng) Geocoder geocoder = Ny Geocoder (getActivity ()); Stringadresse = ""; prøv address = geocoder .getFromLocation (latLng.latitude, latLng.longitude, 1) .get (0) .getAddressLine (0);  fangst (IOException e)  returadresse;  @Override public boolean onMarkerClick (Marker markør) marker.showInfoWindow (); returnere sant; 

5. Tegning på kartet

De Google Kart objektet har et sett med metoder som gjør det enkelt å tegne figurer og plassere bilder på kartet. For å tegne en enkel sirkel trenger du bare å opprette en CircleOptions objekt, sett en radius og senterplassering, og definer slag / fyllfargene og størrelsen.

Når du har en CircleOptions objekt, du kan ringe addCircle å tegne den definerte sirkelen på toppen av kartet. Akkurat som når du plasserer markører, returnerer objekter som er trukket på kartet et objekt av tegnet art, slik at det kan refereres senere hvis det er nødvendig.

privat tomgangstegnCircle (LatLng-plassering) CircleOptions options = new CircleOptions (); options.center (plassering); // Radius i meter options.radius (10); options.fillColor (getResources () .getColor (R.color.fill_color)); options.strokeColor (getResources () .getColor (R.color.stroke_color)); options.strokeWidth (10); . GetMap () addCircle (opsjoner); 

For å tegne en annen lukket modus, kan du ta flere LatLng poeng og opprett en PolygonOptions gjenstand. Som du kan se nedenfor, PolygonOptions er opprettet på samme måte som CircleOptions. Istedenfor å bruke en senter og radius metode, du bruker Legg til med en liste over poeng. Du kan da ringe addPolygon å tegne formen. For dette eksempelet tegner du bare en trekant på kartet.

privat ugyldig tegningPolygon (LatLng startLocation) LatLng point2 = ny LatLng (startingLocation.latitude + .001, startingLocation.longitude); LatLng point3 = ny LatLng (startingLocation.latitude, startingLocation.longitude + .001); PolygonOptions options = new PolygonOptions (); options.add (startingLocation, punkt2, punkt3); options.fillColor (getResources () .getColor (R.color.fill_color)); options.strokeColor (getResources () .getColor (R.color.stroke_color)); options.strokeWidth (10); getMap (). addPolygon (alternativer);  

Den endelige tegningen du vil lære om, er å legge til et bilde som et overlegg på kartet. Overlegg kan være nyttig hvis du har et tegnet kart for et område du vil vise på toppen av en vanlig karttype. Dette kan oppnås ved å opprette en GroundOverlayOptions med et angitt sted, bredde og høyde, og bildet du vil bruke som en BitmapDescriptor.

I den følgende metoden tegner du lanseringsikonet for appen som et overlegg på kartfliser.

Privat tomt tegningOverlay (LatLng plassering, int bredde, int høyde) GroundOverlayOptions options = new GroundOverlayOptions (); options.position (plassering, bredde, høyde); options.image (BitmapDescriptorFactory .fromBitmap (BitmapFactory .decodeResource (getResources (), R.mipmap.ic_launcher))); getMap (). addGroundOverlay (alternativer); 

Konklusjon

I denne opplæringen har du lært hvordan du oppretter en API-nøkkel og aktiverer Google Maps for Android. Du lærte også om MapFragment klassen og noen av de grunnleggende funksjonene du kan aktivere for et kart.

Du har lært hvordan du plasserer markører, lytter etter samspill med kartet, og hvordan du tegner på kartet for å vise tilleggsinformasjon.

I neste opplæring i denne serien lærer du hvordan du legger over en Utsikt over MapFragment, hvordan å kommunisere med innendørs nivå kart, og hvordan å vise en gatevisning til brukerne dine.