Fără îndoială, hărțile sunt unul dintre instrumentele cele mai utile pentru utilizatori când sunt incluse într-o aplicație. Acest tutorial este primul dintr-o serie care trece peste Google Maps v2 pentru Android. Acesta va include instalarea API-ului Google Maps prin Consola pentru dezvoltatori Google, inclusiv un fragment de hartă în aplicațiile dvs., afișarea locației utilizatorului, adăugarea de marcaje, desenarea pe hartă și câteva metode generale care vor adăuga utilitate aplicației dvs. Toate codurile pentru acest tutorial pot fi găsite pe GitHub.
Pentru a utiliza API-ul Google Maps, trebuie să vă înregistrați aplicația pe Google Developer Console și să activați API-ul. Pentru a face acest lucru, începeți prin a merge la Consola pentru dezvoltatori Google. Dacă aveți deja un proiect creat, puteți trece peste secțiunea următoare. Dacă nu, puteți urma și creați un nou proiect pentru aplicația dvs. pentru hărți.
Pentru a crea un nou proiect, faceți clic pe albastru Creați un proiect în colțul din stânga sus al ecranului. Dacă nu vedeți a Creați un proiect apoi căutați un buton etichetat Creați un proiect gol.
Aceasta vă prezintă un dialog care solicită numele unui proiect. Pentru acest tutorial, am creat un proiect numit TutsPlusMaps. Există unele restricții cu privire la ceea ce puteți numi proiectul dvs. deoarece sunt permise numai literele, numerele, citatele, cratimele, spațiile și punctele de exclamare.
Odată ce ai lovit Crea, în colțul din dreapta jos al paginii apare un dialog cu un indicator de încărcare în timpul creării proiectului.
Când proiectul a fost creat sau dacă ați selectat un proiect existent, sunteți îndreptat către proiect Prezentare generală ecran. De aici veți dori să vă extindeți API și auth din panoul de navigare din stânga și faceți clic pe API-uri.
În timp ce există o casetă de căutare pe acest ecran, veți observa că Google a plasat elementele API-ului Hărți în partea de sus a coloanei centrale pentru ca dezvoltatorii să poată accesa. Pentru acest tutorial, faceți clic pe elementul intitulat API-ul Google Maps API sub API-urile Google Maps rubrică.
Aceasta vă duce la un ecran unde puteți face clic pe albastru Activați API-ul pentru a activa API-ul Maps pentru proiectul dvs..
După ce ați activat API-ul Maps, faceți clic pe scrisori de acreditare sub punctul API și auth în navigația laterală pentru a obține o cheie pentru a accesa aplicația Maps API. Când vi se prezintă scrisori de acreditare dialog, apăsați pe albastru Adăugați acreditări și selectați Cheia API.
Deoarece aceasta este o aplicație Android, trebuie să selectați Tasta Android în dialogul următor. Dacă ați crea aceeași aplicație utilizând hărți pe diferite platforme, puteți crea o cheie pentru fiecare platformă.
În ecranul următor, faceți clic pe Adăugați numele pachetului și amprenta. Aceasta oferă două câmpuri, unul pentru adăugarea unui numele pachetului și altul pentru adăugarea SHA1 de la cheia de semnare a aplicației.
Pentru acest tutorial, voi folosi numele pachetului com.tutsplus.mapsdemo. Pentru a obține semnătura SHA1, trebuie să deschideți un terminal sau un prompt de comandă și să navigați la locația cheii de semnare a aplicației. Aceasta poate fi fie cheia de eliberare sau debug.keystore. Puteți genera SHA1 cu următoarea comandă:
keytool -list -v -keystore debug.keystore
După ce ați creat cheia SHA1 și l-ați introdus în câmpul de text, faceți clic pe albastru Crea buton. Apoi, vi se prezintă un dialog care conține cheia API pe care trebuie să o adăugați în aplicația Android pentru a accesa API-ul Maps.
În acest moment, puteți crea proiectul inițial Android cu același nume de pachet pe care l-ați folosit pentru crearea cheii API. Odată ce proiectul dvs. este creat, deschideți build.gradle fişier. Trebuie să importați biblioteca de servicii Play pentru hărți. În acest exemplu, trebuie, de asemenea, să importați biblioteca de locații Play Services pentru a seta o poziție inițială pentru hartă. Plasați următoarele linii în dependențe
nod al build.gradle fişier.
compile 'com.google.android.gms: play-services-maps: 7.8.0' compile 'com.google.android.gms: play-services-location: 7.8.0'
După ce ați importat bibliotecile, puteți închide build.gradle și deschide-ți AndroidManifest.xml fişier. Deasupra cerere
nod, trebuie să declarați că aplicația utilizează OpenGL ES 2.0 și să definească permisiunile necesare aplicației dvs..
Rețineți că ACCESS_FINE_LOCATION
permisiunea este necesară numai pentru această demonstrație, pentru a obține locația utilizatorului pentru a defini unde ar trebui să fie afișată inițial harta. Dacă aveți o locație cunoscută în propria aplicație, nu este nevoie să utilizați locația utilizatorului.
În cadrul cerere
nod, trebuie să adăugați două fragmente de metadate. Primul informează aplicația că sunt folosite serviciile Play și al doilea angajează cheia API-ului Maps cu aplicația. În următorul fragment de cod, @ String / google_api_key
este o referință de șir la cheie din Consola pentru dezvoltatori Google.
După ce ați terminat actualizarea AndroidManifest.xml, continuați și închideți fișierul. Apoi, trebuie să creați o nouă clasă Java, numită MapFragment
, care se extinde SupportMapFragment
. SupportMapFragment
este folosit aici mai degrabă decât com.google.android.gms.maps.MapFragment
pentru a adăuga compatibilitate înapoi înainte de API 12.
Dacă aplicația dvs. nu are nevoie să suporte dispozitive care rulează versiuni mai vechi de Android, atunci este bine să le utilizați com.google.android.gms.maps.MapFragment
. Odată ce ați creat fragmentul de bază, trebuie să implementați cele șase interfețe pe care le vom folosi pentru această demonstrație.
public classFrameFragment extinde SupportMapFragment implementează GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GoogleMap.OnInfoWindowClickListener, GoogleMap.OnMapLongClickListener, GoogleMap.OnMapClickListener, GoogleMap.OnMarkerClickListener
ConnectionCallbacks
și OnConnectionFailedListener
sunt concepute pentru a monitoriza starea GoogleApiClient
, care este folosit în această aplicație pentru a obține locația curentă a utilizatorului.OnInfoWindowClickListener
este declanșată atunci când utilizatorul face clic pe fereastra de informații care apare peste un marcator de pe hartă.OnMapLongClickListener
și OnMapClickListener
sunt declanșate atunci când utilizatorul întrerupe sau reține o porțiune a hărții.OnMarkerClickListener
este apelat atunci când utilizatorul face clic pe un marcator de pe hartă, care de obicei afișează și fereastra de informații pentru acel indicator.Când vi se solicită, faceți clic pe becul roșu care apare lângă numele clasei pentru a adăuga metodele necesare pentru aceste interfețe.
Odată ce ați construit fragmentul inițial, trebuie să lăsați Activitate principala știți că ar trebui să folosească acest fragment. Deschis activity_main.xml din folderul resurse și modificați-l astfel încât acesta să includă fragmentul ca vizualizare.
După actualizarea layout-ului de activitate, ar trebui să puteți executa aplicația dvs. și să vizualizați o hartă a Terrei care este complet micșorată și orientată spre latitudinea 0, longitudinea 0.
Revenind la serviciul nostru MapFragment
, trebuie să definiți câteva valori globale în partea de sus a clasei pentru a fi utilizate în aplicația dvs..
GoogleApiClient privat mGoogleApiClient; locație privată mCurrentLocation; private final int [] MAP_TYPES = GoogleMap.MAP_TYPE_SATELLITE, GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_TERRAIN, GoogleMap.MAP_TYPE_NONE; private int curMapTypeIndex = 0;
Aici mGoogleApiClient
și mCurrentLocation
sunt utilizate pentru a obține locația utilizatorului pentru inițializarea camerei de hartă. MAP_TYPES
și curMapTypeIndex
sunt utilizate în exemplul de cod pentru a comuta între diferite tipuri de afișare a hărților. Fiecare tip de hartă servește unui scop diferit, astfel încât unul sau mai multe pot fi potrivite pentru propriile aplicații.
GoogleMap.MAP_TYPE_SATELLITE
afișează o vedere prin satelit a zonei fără nume de stradă sau etichete.
GoogleMap.MAP_TYPE_NORMAL
arată o hartă generică cu nume de stradă și etichete.
GoogleMap.MAP_TYPE_HYBRID
combină modul satelit și modul normal, afișând imagini prin satelit ale unei zone cu toate etichetele.
GoogleMap.MAP_TYPE_TERRAIN
este similar cu o hartă normală, dar sunt adăugate texturi pentru a afișa modificările în elevație în mediul înconjurător. Aceste texturi sunt cele mai vizibile când harta este înclinată cu o tragere cu două degete.
GoogleMap.MAP_TYPE_NONE
este similar cu o hartă normală, dar nu afișează etichete sau colorări pentru tipul de mediu dintr-o zonă. Aceasta permite afișarea pe hartă a traficului și a altor suprapuneri.
Apoi, trebuie să vă creați GoogleApiClient
și inițiază Servicii de localizare
pentru a obține locația curentă a utilizatorului. După cum am menționat mai devreme, dacă aveți o locație setată pe care doriți să o afișați mai degrabă decât să vă concentrați asupra utilizatorului, puteți să omiteți utilizarea acesteia Servicii de localizare
.
@Override publice void onViewCreated (Vizualizare vizualizare, Bundle savedInstanceState) super.onViewCreated (vizualizare, savedInstanceState); setHasOptionsMenu (true); mGoogleApiClient = nou GoogleApiClient.Builder (getActivity ()) .addConnectionCallbacks (acest) .addOnConnectionFailedListener (acest) .addApi (LocationServices.API) .build (); initListeners ();
initListeners
metoda leagă interfețele pe care le-ați declarat în partea de sus a clasei cu Harta Google
obiect asociat cu SupportMapFragment
. Acesta este aspectul implementării:
private void initListeners () getMap (). setOnMarkerClickListener (acest lucru); getMap () setOnMapLongClickListener (aceasta). getMap (). setOnInfoWindowClickListener (aceasta); getMap () setOnMapClickListener (aceasta).
S-ar putea să fi observat că GoogleApiClient
și ascultătorii sunt creați și legați de onViewCreated
mai degrabă decât tipic onCreate
. Acest lucru se datorează faptului că Harta Google
obiect nu a fost inițializat atunci când onCreate
se numește, deci trebuie să așteptăm până când vizualizarea este creată pe deplin înainte de a încerca să suni getMap
pentru a evita o NullPointerException
.
De vreme ce veți configura aparatul de fotografiat pe hartă după ce locația utilizatorului a fost găsită prin intermediul serviciilor Play, vom folosi ciclul de viață al Serviciilor de redare pentru a conduce inițializarea hărții noastre. Puteți conecta GoogleApiClient
în onStart
. Când clientul sa conectat, puteți să-l luați pe cea mai recenta locație a utilizatorului și să o utilizați pentru a viza camera de pe hartă.
@Override publică void onStart () super.onStart (); mGoogleApiClient.connect (); @Override publice void onStop () super.onStop (); dacă (mGoogleApiClient! = null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect (); @Overide public void onConnected (Bundle bundle) mCurrentLocation = LocațiaServicii .FusedLocationApi .getLastLocation (mGoogleApiClient); initCamera (mCurrentLocation);
În initCamera
, inițializați camera și câteva proprietăți de bază ale hărții. Începeți prin a crea un CameraPosition
obiecte prin CameraPosition.Builder
, cu o țintă stabilită pentru latitudinea și longitudinea utilizatorului și un nivel de zoom stabilit.
Înclinarea și lagărul sunt utilizate aici la valorile lor implicite pentru a ilustra că acestea sunt opțiuni disponibile. Odată ce ai CameraPosition
obiect, puteți anima camera de hartă în acea poziție folosind CameraUpdateFactory
.
private void initCamera LocationPosition position = CameraPosition.builder () .target (new LatLng (location.getLatitude (), location.getLongitude ())) .zoom (16f) f) .build (); getMap () animateCamera (CameraUpdateFactory.newCameraPoziția (poziția), null); getMap (). setMapType (MAP_TYPES [curMapTypeIndex]); getMap (). setTrafficEnabled (adevărat); getMap () setMyLocationEnabled (adevărat); getMap (). getUiSettings () setZoomControlsEnabled (adevărat);
La sfârșitul acestei metode, veți observa ultimele patru linii care au stabilit câteva proprietăți pentru hartă. Stabiliți tipul hărții, așa cum este descris mai devreme în acest tutorial, și activați suprapunerile fluxului de trafic live în primele două rânduri. setMyLocationEnabled
adaugă un buton în colțul din dreapta sus al paginii MapFragment
care deplasează automat camera la locația utilizatorului atunci când este apăsată.
În cele din urmă setZoomControlsEnabled
adaugă + și - butoanele din colțul din dreapta jos, permițând utilizatorului să modifice nivelul de mărire a hărții fără a fi nevoie să utilizeze gesturi. Există câteva lucruri interesante pe care le puteți folosi UiSettings
, cum ar fi adăugarea unei busole sau a unor gesturi dezactivate, pe care le puteți găsi în documentația de referință Android.
Una dintre cele mai utilizate caracteristici ale hărții implică indicarea locațiilor cu marcaje. Deoarece este necesară o latitudine și longitudine pentru adăugarea unui marcator, trebuie să utilizați OnMapClickListener
pentru a permite utilizatorului să aleagă un loc pe hartă pentru a plasa a Marker
obiect.
@Override publice void onMapClick (LatLng LatLng) Opțiuni MarkerOptions = poziție MarkerOptions () new (latLng); options.title (getAddressFromLatLng (latLng)); options.icon (BitmapDescriptorFactory.defaultMarker ()); getMap (). addMarker (opțiuni);
Această metodă creează un marcator roșu generic în care utilizatorul a accesat. Opțiunile suplimentare, cum ar fi setarea unui marcator ca draggable, pot fi setate prin MarkerOptions
obiect. Puteți găsi atribute suplimentare în documentația oficială de referință Android. Dacă doriți să modificați culoarea marcatorului, puteți apela BitmapDescriptorFactory.defaultMarker
când adăugați o pictogramă la MarkerOptions
. defaultMarker
metoda acceptă o valoare float care definește nuanța. Nuanța poate fi setată manual sau ca valoare statică predefinită BitmapDescriptorFactory
. Ar trebui menționat acest lucru addMarker
returnează a Marker
obiect, care poate fi stocat pentru eliminarea manuală a marcatorilor specifici, dacă este necesar.
Dacă doriți să evitați folosirea pinilor generici colorați pentru marcajele de locație, puteți seta o imagine bitmap ca pictogramă pe MarkerOptions
obiect. Pentru a demonstra acest lucru, vă suprascrieți onMapLongClick
astfel încât să utilizeze pictograma aplicației din folderul de resurse ca un Marker
când utilizatorul dvs. apasă lung harta.
@Override publice void onMapLongClick (LatLng latLng) Opțiuni MarkerOptions = poziție MarkerOptions () new (latLng); options.title (getAddressFromLatLng (latLng)); options.icon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.mipmap.ic_launcher))); getMap (). addMarker (opțiuni);
Probabil ați observat că getAddressFromLatLng
metoda este utilizată în ambele metode de clic. Aceasta este o metodă de ajutor care ia o LatLng
și o rulează printr-o geocoder
pentru a obține o adresă de stradă. În ultimele două exemple, folosim această metodă pentru a afișa o adresă de stradă atunci când este marcat un marcator.
Stringul privat getAddressFromLatLng (LatLng latLng) Geocoder geocoder = nou Geocoder (getActivity ()); Adresă șir = ""; încercați address = geocoder .getFromLocation (latLng.latitude, latLong.longitude, 1) .get (0) .getAddressLine (0); captură (IOException e) adresa de retur; @Override public boolean onMarkerClick (marcator marker) marker.showInfoWindow (); return true;
Harta Google
obiectul are un set de metode care fac ușor să deseneze forme și să plaseze imagini pe hartă. Pentru a desena un cerc simplu, trebuie doar să creați un CircleOptions
obiect, setați o rază și o locație centrală și definiți culorile și dimensiunile de umplere / umplere.
Odată ce ai CircleOptions
obiect, puteți apela addCircle
pentru a desena cercul definit deasupra hărții. La fel ca la plasarea markerelor, obiectele care sunt desenate pe hartă returnează un obiect al tipului de element desenat, astfel încât acesta să poată fi referit mai târziu, dacă este necesar.
private void drawCircle (locația LatLng) CircleOptions options = new CircleOptions (); options.center (locație); // Radius în metrii options.radius (10); options.fillColor (getResources () .getColor (R.color.fill_color)); options.strokeColor (getResources () .getColor (R.color.stroke_color)); options.strokeWidth (10); . GetMap () addCircle (opțiuni);
Pentru a desena o altă formă închisă, puteți lua mai multe LatLng
puncte și creați un PolygonOptions
obiect. După cum puteți vedea mai jos, PolygonOptions
sunt create în mod similar cu CircleOptions
. În loc să folosești a centru
și rază
metodă, pe care o utilizați adăuga
cu o listă de puncte. Apoi puteți apela addPolygon
pentru a desena forma. Pentru acest exemplu, trageți pur și simplu un triunghi pe hartă.
void privat drawPolygon (LatLng startingLocation) LatLng punct2 = LatLng nou (startLocation.latitude + .001, startingLocation.longitude); LatLng punct3 = LatLng nou (startLocation.latitude, startingLocation.longitude + .001); Opțiunile de opțiuni Poligon = noi PolygonOptions (); options.add (startLocation, point2, point3); options.fillColor (getResources () .getColor (R.color.fill_color)); options.strokeColor (getResources () .getColor (R.color.stroke_color)); options.strokeWidth (10); getMap (). addPolygon (opțiuni);
Tipul final de desen pe care îl veți afla este adăugarea unei imagini ca suprapunere pe hartă. Suprapunerile pot fi utile dacă aveți o hartă desenată pentru o zonă pe care doriți să o afișați pe lângă un tip de hartă normală. Acest lucru se poate realiza prin crearea unui GroundOverlayOptions
cu o locație setată, lățime și înălțime și imaginea pe care doriți să o utilizați ca a BitmapDescriptor
.
În următoarea metodă, desenați pictograma lansator pentru aplicație ca suprapunere pe plăcile de hartă.
private void drawOverlay (locația LatLng, int lățime, int înălțime) GroundOverlayOptions options = new GroundOverlayOptions (); opțiuni.locație (locație, lățime, înălțime); options.image (BitmapDescriptorFactory .fromBitmap (BitmapFactory .decodeResource (getResources (), R.mipmap.ic_launcher))); getMap (). addGroundOverlay (opțiuni);
În acest tutorial, ați învățat cum să creați o cheie API și să activați Google Maps for Android. De asemenea, ați aflat despre MapFragment
clasa și câteva dintre caracteristicile de bază pe care le puteți activa pentru o hartă.
Ați învățat cum să plasați markeri, să ascultați interacțiunile cu harta și cum să atrageți harta pentru a afișa informații suplimentare.
În următorul tutorial al acestei serii, veți învăța cum să suprapuneți a Vedere
peste MapFragment
, cum să interacționați cu hărțile de nivel interior și cum să afișați o vizualizare stradă utilizatorilor dvs..