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.
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.
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.
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.
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.
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.
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.
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
.
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);
I 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.
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;
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);
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.