Google Play Services: Bruke Places API
71
Del
38
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I mars 2015 lanserte Google Steder-API for Android som en del av Googles Play Services. Dette API tillater utviklerne å få tilgang til et vell av informasjon fra Google for å gi brukerne en opplevelse skreddersydd til sin nåværende plassering ved å bruke navn og informasjon om steder, snarere enn et sett med koordinater.
I denne opplæringen vil du lære hvordan du kan presentere dine brukere med Place Picker komponent, bruke Steder API å gjette brukerens gjeldende stedet, søke etter et sted av sin ID, og tillater brukeren å skrive inn et tekstfelt for å presentere dem med prediktiv resultater.
1. Få satt opp
Hvis du ikke allerede har en Android offentlig API-nøkkel, må du opprette en offentlig Google API-nøkkel for Android-programmer. Du kan gjøre dette ved å gå til Googles utviklere Console. Instruksjoner for å lage en nøkkel basert på signeringssertifikatet og pakkenavn er tilgjengelig i Googles dokumentasjon og er utenfor omfanget av denne artikkelen.
Når du har opprettet en nøkkel, søk etter den Places API og sett den til aktivert. Noen samtaler til steder API er begrenset i hvor mange forespørsler kan sendes per 24-timers periode. I skrivende stund, kan en konto uten fakturering profil sende opptil 1.000 forespørsler samtidig en konto med en fakturerings profil kan sende 150.000 forespørsler. Hvis du trenger mer, kan du sende inn en forespørsel om å få denne grensen økt som beskrevet i dokumentasjonen bruk grenser.
Med API-nøkkel klar til bruk, er det på tide å begynne å jobbe på demo-prosjektet . Opprett et prosjekt i Android Studio og sette minimum støttet SDK versjon til minst 9. Dette er et minimumskrav for å bruke Googles Play Services.
Når Android Studio har skapt Hello World mal prosjektet, åpner bygge. gradle fil og under avhengig node, legge den nødvendige avhengighet av Play Services 7.0. Dette er den nyeste i skrivende stund, men du kan kontrollere den nyeste versjonen ved å sjekke Googles dokumentasjon
avhengig {kompilere fileTree (dir: 'libs', inkluderer: ['* .jar']). Kompilere 'com. android.support:appcompat-v7:22.0.0 'kompilere' com.google.android.gms: play-tjenester: 7.0.0 '}
Deretter åpner AndroidManifest.xml, legge de nødvendige tillatelser for prosjektet, og oppgir at OpenGL versjon 2 kreves av søknaden
< bruker-tillatelse android. name = "com.google.android.providers.gsf.permission.READ_GSERVICES" /> < bruker-tillatelse android: name = "android.permission.ACCESS_FINE_LOCATION" /> < bruker-feature android: glEsVersion = "0x00020000" android: påbudt = "true" />
Det siste du trenger å gjøre i manifestet er å legge to og lt; meta-data > koder for å angi gram versjon og API-nøkkel for app i < søknaden > tag
< meta-data android. name = "com.google.android.geo.API_KEY" android: value = "@ streng /google_api_key" /> < meta-data android: name = "com. google.android.gms.version "android: value =" @ heltall /google_play_services_version "/>
Når du er ferdig med kompendiet, er du klar til å begynne å skrive kode. Siden dette er en komponent fra Play Services, må du initialisere GoogleApiClient og koble til /koble den under aktivitet livssyklus. Vi gjør dette i onCreate, onStart, og onStop metoder for aktivitetsklassen
Overrideprotected void onCreate (Bundle savedInstanceState) {//-. Snippet mGoogleApiClient = new GoogleApiClient .Builder (denne) .enableAutoManage (dette , 0, dette) .addApi (Places.GEO_DATA_API) .addApi (Places.PLACE_DETECTION_API) .addConnectionCallbacks (denne) .addOnConnectionFailedListener (denne) att bygga ();} @ Overrideprotected void onStart () {super.onStart (); if (mGoogleApiClient = null!) mGoogleApiClient.connect ();} @ Overrideprotected void onStop () {if (mGoogleApiClient = null &! & mGoogleApiClient.isConnected ()) {mGoogleApiClient.disconnect (); } Super.onStop ();}
2. Bruke Place Picker Widget
The Place Picker widget er et brukergrensesnitt komponent levert av Play Services som gjør at brukeren kan se et kart over sitt nærområdet. Komponenten inneholder en liste over nærliggende steder som kan brukes av programmet ditt. Ved å bruke denne komponenten, er du i stand til å følge en standard design som brukerne vil vite hvordan de skal samhandle med og være i stand til å spare på utviklingstid.
For å bruke Place Picker, må du opprette en intensjon og lytt for aktiviteten resultatet for å hente sted valgt av brukeren. Følgende metode viser hvordan du ville lansere denne aktiviteten
private void displayPlacePicker () {if (mGoogleApiClient == null || mGoogleApiClient.isConnected ()!) Tilbake.; PlacePicker.IntentBuilder byggmester = new PlacePicker.IntentBuilder (); try {startActivityForResult (builder.build (getApplicationContext ()), PLACE_PICKER_REQUEST); } Catch (GooglePlayServicesRepairableException e) {Log.d ("PlacesAPI Demo", "GooglePlayServicesRepairableException kastet"); } Catch (GooglePlayServicesNotAvailableException e) {Log.d ("PlacesAPI Demo", "GooglePlayServicesNotAvailableException kastet"); }}
PlacePicker.IntentBuilder brukes til å lage den Intent som skal brukes til å starte Place Picker. Den har også en metode tilgjengelig, setLatLngBounds, som lar deg plassere en geografisk grense fra en sørvest hjørnet til en nordøstre hjørne for å kontrollere søkeområdet.
Intent kan bygges ved hjelp av bygge-metoden fra PlacePicker.IntentBuilder og lanserte bruker startActivityForResult metoden fra aktivitets. Det bør bemerkes at ved hjelp av bygge metoden ikke har mulighet for å kaste en GooglePlayServicesRepairableException eller en GooglePlayServicesNotAvailableException unntak, så de bør sjekkes for å bruke en standard prøve /catch-blokken og håndteres grasiøst hvis de oppstår.
Hvis Brukeren velger en plassering fra stedet velgeren listen, som Place objekt er pakket inn i en intensjonsavtale og sendt tilbake til kallet aktivitet. Bruke PlacePicker.getPlace metoden, kan du trekke ut Place data fra den returnerte Intent
beskyttet void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == PLACE_PICKER_REQUEST & & resultCode == RESULT_OK). {displayPlace (PlacePicker.getPlace (data, dette)); }}
Når Place objektet er pakket ut, kan det bli behandlet som en modell objekt for å vise eller bruke i din app
private void displayPlace (Place sted) {if (sted == null) avkastning.; String content = ""; (! TextUtils.isEmpty (place.getName ())) hvis {innhold + = "Navn:" + place.getName () + "\\ n"; } If (! TextUtils.isEmpty (place.getAddress ())) {innhold + = "Adresse:" + place.getAddress () + "\\ n"; } If (! TextUtils.isEmpty (place.getPhoneNumber ())) {innhold + = "Tlf:" + place.getPhoneNumber (); } MTextView.setText (innhold);}
3. Finne Bruker Current Place
Et annet interessant trekk ved Places API er at du kan bruke den til å gjette hvis brukeren er for tiden på et børsnotert sted. API vil også gi en sannsynlighet, slik at du kan ta informerte beslutninger om hvordan appen skal samhandle med brukeren. Det bør bemerkes at dette er en av funksjonene i API som krever en forespørsel mot dine tildelte bruksområder.
For å oppdage brukerens sted, må du bruke Places.PlacesDetectionApi.getCurrentPlace metode for å lage en PendingIntent som returnerer med en PlaceLikelihoodBuffer objekt. Ved hjelp av en ResultCallBack, kan du ta det første, og mest sannsynlig, sted fra buffer og bruke det i programmet ditt.
Hvis din app trenger mer informasjon, kan du trekke andre PlaceLikelihood elementer fra bufferen ved looping gjennom den. Sannsynligheten for at dette stedet er der brukeren er for tiden lokalisert føres tilbake i hvert PlaceLikelihood objekt som et flyttall fra 0.0 til 1.0, 1.0 blir nesten en garantert kamp. Ikke glem å ringe slippe på PlaceLikelihoodBuffer å unngå eventuelle minnelekkasjer
private void guessCurrentPlace () {PendingResult. ≪ PlaceLikelihoodBuffer > Resultatet = Places.PlaceDetectionApi.getCurrentPlace (mGoogleApiClient, null); result.setResultCallback (ny ResultCallback < PlaceLikelihoodBuffer > () {Override public void onResult (PlaceLikelihoodBuffer likelyPlaces) {PlaceLikelihood placeLikelihood = likelyPlaces.get (0); String content = ""; if (placeLikelihood = null &! & placeLikelihood. getPlace () = null & & TextUtils.isEmpty (placeLikelihood.getPlace () getName ().)) content = "Mest sannsynlig sted:"!. + placeLikelihood.getPlace () getName () + "\\ n"; if (! placeLikelihood = null) innhold + = "Prosent endring av å være der:" + (int) (placeLikelihood.getLikelihood () * 100) + "%"; mTextView.setText (innhold), likelyPlaces.release ();} });}
4. Forutsi Places
Den neste, og mest komplekse, tema vi vil gå over i denne opplæringen er å forutsi og vise steder for brukeren som de kommer inn et søk. Igjen, teller dette API-kall også mot API bruk grenser. Men det er uvurderlig for å gjøre din app mer brukbar.
For denne delen av opplæringen skal du bruke en AutoCompleteTextView og en tilpasset adapter i appen skrive inn navnet på et sted for spådommer. Nesten alt arbeidet er gjort i adapteren. Men vi trenger å passere en referanse til GoogleApiClient til adapteren for å få tilgang til API.
Dette kan gjøres i standard GoogleApiClient tilbakeringing, onConnected, og vi kan fjerne forekomsten av klienten i . onStop hvor mAdapter er en forekomst av våre tilpassede Adapter klasse, AutoCompleteAdapter
Overrideprotected void onStop () {if (mGoogleApiClient = null &! & mGoogleApiClient.isConnected ()) {mAdapter.setGoogleApiClient (null); mGoogleApiClient.disconnect (); } Super.onStop ();} @ Overridepublic void onConnected (Bundle bundle) {if (mAdapter = null!) MAdapter.setGoogleApiClient (mGoogleApiClient);}
For å utløse et API-kall når brukeren skriver et nytt brev til den AutoCompleteTextView , må du overstyre getFilter metoden i ArrayAdapter. Denne metoden er utløst hver gang brukeren endrer innholdet i visningen forbundet med adapteren. Den lar deg endre innholdet av adapteren av AutoCompleteTextView. I følgende eksempel er begrensninger innholdet av visningen.
Overridepublic Filter getFilter () {return new Filter () {Override beskyttet FilterResults performFiltering (CharSequence tvang) {if (mGoogleApiClient == null ||! MGoogleApiClient. isConnected ()) {Toast.makeText (getContext (), "Ikke tilkoblet", Toast.LENGTH_SHORT) .vis (); returnere null; } Klart (); displayPredictiveResults (constraint.toString ()); returnere null; }Override Beskyttet void publishResults (CharSequence begrensningen, FilterResults resultater) {notifyDataSetChanged (); }};}
displayPredictiveResults metoden er der selve samspillet med API oppstår. Det finnes flere ulike gjenstander som kan gjøres for å tilpasse dine spådommer.
Den første er en LatLngBounds objekt som skaper en firkantet grense fra en sørvest punkt til et nordøst poeng å lokalisere søket. Hvis null er passert stedet for en initialisert LatLngBounds protestere, så ingen geografiske begrensninger vil bli plassert på søket
LatLngBounds grenser = nye LatLngBounds (ny LatLng (39,906374, -105,