I mars 2015 lanserte Google Steds-API for Android som en del av Googles Play Services. Med denne API-en kan utviklere få tilgang til et vell av informasjon fra Google for å gi brukerne en opplevelse tilpasset deres nåværende beliggenhet ved å bruke navnene og informasjonen til steder, i stedet for et sett med koordinater.
I denne opplæringen lærer du hvordan du skal presentere brukerne med Place Picker-komponenten, bruk Steds-API for å gjette brukerens nåværende sted, søke etter et sted med sin ID, og la brukeren skrive inn i et tekstfelt for å presentere dem med prediktive resultater.
Hvis du ikke allerede har en Android-offentlig API-nøkkel, må du opprette en offentlig Google API-nøkkel for Android-applikasjoner. Du kan gjøre dette ved å besøke Googles utviklerkonsoll. Instruksjoner for å opprette en nøkkel basert på signeringssertifikatet og pakkenavnet er tilgjengelig i Googles dokumentasjon og er utenfor rammen av denne artikkelen.
Når du har opprettet en nøkkel, søk etter Steds-API og sett den til aktivert. Noen anrop til Steder-API er begrenset til hvor mange forespørsler som kan sendes per 24-timers periode. Ved skriving kan en konto uten faktureringsprofil sende opptil 1000 forespørsler, mens en konto med en faktureringsprofil kan sende 150 000 forespørsler. Hvis du trenger mer, kan du sende inn en forespørsel om å øke denne grensen som beskrevet i dokumentasjonen for bruksgrenser.
Med API-nøkkelen klar til bruk, er det på tide å begynne å jobbe med demo-prosjektet. Opprett et prosjekt i Android Studio og sett den minste støttede SDK-versjonen til minst 9. Dette er minimumskravet for bruk av Googles Play Services.
Når Android Studio har opprettet Hei Verden mal prosjekt, åpne build.gradle fil og, under avhengig
nod, legg til den nødvendige avhengigheten av Play Services 7.0. Dette er det siste ved skriving, men du kan bekrefte den nyeste versjonen ved å sjekke Googles dokumentasjon.
avhengigheter compile fileTree (dir: 'libs', inkluderer: ['* .jar']) kompilere 'com.android.support:appcompat-v7:22.0.0' kompilere 'com.google.android.gms: spilltjenester : 7.0.0 '
Deretter åpne AndroidManifest.xml, legg til de nødvendige tillatelsene for prosjektet, og oppgi at OpenGL versjon 2 kreves av programmet.
Det siste du må gjøre i manifestet, er å legge til to
koder for å angi gms-versjonen og API-nøkkelen for appen i
stikkord.
Når du er ferdig med manifestet, er du klar til å begynne å skrive kode. Siden dette er en komponent fra Play Services, må du initialisere din GoogleApiClient
og koble til / koble den fra under din Aktivitet
livssyklus. Vi gjør dette i onCreate
, onStart
, og onStop
metoder for Aktivitet
klasse.
@Override protected void onCreate (Bundle savedInstanceState) // - Utdrag mGoogleApiClient = nytt GoogleApiClient .Builder (dette) .enableAutoManage (dette, 0, dette) .addApi (Places.GEO_DATA_API) .addApi (Places.PLACE_DETECTION_API) .addConnectionCallbacks dette) .addOnConnectionFailedListener (dette) .build (); @Override protected void onStart () super.onStart (); hvis (mGoogleApiClient! = null) mGoogleApiClient.connect (); @Override protected void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect (); super.onStop ();
Place Picker-widgeten er en brukergrensesnittkomponent som leveres av Play Services, som lar brukeren se et kart over deres omliggende område. Komponenten inneholder en liste over nærliggende steder som kan brukes av appen din. Ved å bruke denne komponenten kan du følge et standarddesign som brukerne dine vil vite hvordan de skal samhandle med, samtidig som de kan spare på utviklingstiden.
For å bruke Place Picker, må du opprette en hensikt og lytte etter Aktivitet
Resultatet er å hente stedet valgt av brukeren. Følgende metode viser hvordan du vil starte dette Aktivitet
.
private void displayPlacePicker () if (mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) returnere; PlacePicker.IntentBuilder builder = nytt PlacePicker.IntentBuilder (); prøv startActivityForResult (builder.build (getApplicationContext ()), PLACE_PICKER_REQUEST); catch (GooglePlayServicesRepairableException e) Log.d ("PlacesAPI Demo", "GooglePlayServicesRepairableException kastet"); fangst (GooglePlayServicesNotAvailableException e) Log.d ("PlacesAPI Demo", "GooglePlayServicesNotAvailableException kastet");
De PlacePicker.IntentBuilder
brukes til å lage Intent
som vil bli brukt til å starte Place Picker. Det har også en metode tilgjengelig, setLatLngBounds
, som lar deg plassere en geografisk grense fra et sørvest hjørne til et nordøst hjørne for å kontrollere søkeområdet.
De Intent
kan bygges ved hjelp av bygge
metode fra PlacePicker.IntentBuilder
og lansert ved hjelp av startActivityForResult
metode fra din Aktivitet
. Det bør bemerkes at du bruker bygge
Metoden har muligheten til å kaste a GooglePlayServicesRepairableException
eller a GooglePlayServicesNotAvailableException
unntak, så de bør kontrolleres for å bruke en standard prøve / fangst blokk og håndteres grasiøst hvis de oppstår.
Hvis brukeren velger en plassering fra plukklisten, vil det Sted
objektet er pakket inn i en Intent
og sendt tilbake til kallet Aktivitet
. Bruker PlacePicker.getPlace
Metode, du kan trekke ut Sted
data fra den returnerte Intent
.
beskyttet tomt onActivityResult (int requestCode, int resultCode, Intent data) hvis (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) displayPlace (PlacePicker.getPlace (data, dette));
Først når Sted
objektet trekkes ut, det kan behandles som et modellobjekt som skal vises eller brukes i appen din.
privat tomt skjermbilde (Sted) hvis (sted == null) tilbake; String innhold = ""; hvis (! TextUtils.isEmpty (place.getName ())) content + = "Name:" + place.getName () + "\ n"; hvis (! TextUtils.isEmpty (place.getAddress ())) content + = "Adresse:" + place.getAddress () + "\ n"; hvis (! TextUtils.isEmpty (place.getPhoneNumber ())) content + = "Telefon:" + place.getPhoneNumber (); mTextView.setText (innhold);
En annen interessant funksjon i Steds-API er at du kan bruke den til å gjette om brukeren for øyeblikket er på et oppført sted. API-en vil også gi en sannsynlighet slik at du kan ta informerte beslutninger om hvordan appen din skal samhandle med brukeren. Det bør bemerkes at dette er en av funksjonene i API-en som krever en forespørsel mot de tildelte bruksområder.
For å oppdage brukerens sted, må du bruke Places.PlacesDetectionApi.getCurrentPlace
metode for å lage en PendingIntent
som returnerer med en PlaceLikelihoodBuffer
gjenstand. Bruker en ResultCallBack
, Du kan ta det første, og sannsynligvis, plassere fra bufferen og bruke det i appen din.
Hvis appen din trenger mer informasjon, kan du trekke ut andre PlaceLikelihood
elementer fra bufferen ved å løpe gjennom den. Sannsynligheten for at dette stedet er hvor brukeren befinner seg, ligger nå tilbake i hver PlaceLikelihood
objekt som en flytende punktverdi fra 0.0 til 1.0, 1.0 å være nesten en garantert kamp. Ikke glem å ringe utgivelse
på PlaceLikelihoodBuffer
for å unngå hukommelse lekkasjer.
privat ugyldig gjetningCurrentPlace () PendingResultresult = Places.PlaceDetectionApi.getCurrentPlace (mGoogleApiClient, null); result.setResultCallback (new ResultCallback () @Override offentlig tomrum påResultat (PlaceLikelihoodBuffer likelyPlaces) PlasserSannsynlighet stedLikelihood = likelyPlaces.get (0); String innhold = ""; if (placeLikelihood! = null && placeLikelihood.getPlace ()! = null &&! TextUtils.isEmpty (placeLikelihood.getPlace (). getName ())) content = "Sannsynligste sted:" + stedLikelihood.getPlace (). getName + "\ n"; hvis (placeLikelihood! = null) content + = "Prosent endring av å være der:" + (int) (placeLikelihood.getLikelihood () * 100) + "%"; mTextView.setText (innhold); likelyPlaces.release (); );
Det neste og mest komplekse emnet vi skal gå over i denne opplæringen, spår og viser steder til brukeren når de skriver inn et søk. Igjen, dette API-anropet teller også til APIs bruksgrenser. Det er imidlertid uvurderlig for å gjøre appen din mer brukbar.
For denne delen av opplæringen vil du bruke en AutoCompleteTextView
og en tilpasset adapter i appen for å skrive inn navnet på et sted for spådommer. Nesten alt arbeidet er gjort i adapteren. Imidlertid må vi sende en referanse til GoogleApiClient
til adapteren for å få tilgang til API.
Dette kan gjøres i standarden GoogleApiClient
Ring tilbake, onConnected
, og vi kan fjerne forekomsten av klienten i onStop
hvor mAdapter
er en forekomst av vår tilpassede Adapter
klasse, AutoCompleteAdapter
.
@Override protected void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mAdapter.setGoogleApiClient (null); mGoogleApiClient.disconnect (); super.onStop (); @Override public void onConnected (Bundle bundle) if (mAdapter! = Null) mAdapter.setGoogleApiClient (mGoogleApiClient);
For å utløse en API-samtale når brukeren skriver inn et nytt brev i AutoCompleteTextView
, du må overstyre getFilter
metode av ArrayAdapter
. Denne metoden utløses når brukeren endrer innholdet i visningen som er tilknyttet adapteren. Den lar deg endre innholdet på adapteren til AutoCompleteTextView
. I følgende eksempel, begrensninger
er innholdet i visningen.
@Override public Filter getFilter () returner nytt filter () @Overtrid beskyttet FilterResults performFiltering (CharSequence-begrensning) if (mGoogleApiClient == null ||! MGoogleApiClient.isConnected ()) Toast.makeText (getContext (), "Ikke tilkoblet ", Toast.LENGTH_SHORT) .show (); return null; klare (); displayPredictiveResults (constraint.toString ()); return null; @Override protected void publishResults (CharSequence begrensning, FilterResults resultater) notifyDataSetChanged (); ;
De displayPredictiveResults
Metoden er der den faktiske samspillet med API oppstår. Det er noen forskjellige objekter som kan gjøres for å tilpasse dine spådommer.
Den første er a LatLngBounds
objekt som skaper en kvadratgrense fra sørvestpunkt til nordøstpunkt for å lokalisere spørringen. Hvis null
er bestått i stedet for en initialisert LatLngBounds
objekt, så blir ingen geografiske begrensninger plassert på spørringen.
LatLngBounds bounds = new LatLngBounds (new LatLng (39.906374, -105.122337), ny LatLng (39.949552, -105.068779));
Det andre objektet du kan opprette for å tilpasse spørringen, er et filter for API-forespørselen. Filteret til steder
AutoCompletePredictions
samtale er en liste over Integer
objekter som representerer forskjellige typer filtre. På dette punktet kan bare en filtertype brukes på en forespørsel. De akseptable verdiene finnes i dokumentasjonen. Hvis Integer
listen er tom eller null
er bestått, så returneres alle resultattyper.
Når du er klar til å gjøre forespørselen, kan du bruke Places.GeoDataApi.getAutocompletePredictions
metode for å returnere a PendingIntent
, som kan knyttes til a ResultCallback
for å vise den returnerte informasjonen.
Det er viktig å merke seg at et egendefinert objekt som representerer AutoCompletePrediction
Objekter fra bufferen brukes til å lagre dataene i ArrayAdapter
. Ellers an IllegalArgumentsException
unntak ville bli kastet så snart bufferen ble sluppet, noe som er avgjørende for å unngå minnelekkasje.
private void displayPredictiveResults (String query) // Southwest hjørne til nordøst hjørne. LatLngBounds bounds = new LatLngBounds (new LatLng (39.906374, -105.122337), ny LatLng (39.949552, -105.068779)); // Filter: https://developers.google.com/places/supported_types#table3 ListfilterTypes = ny ArrayList (); filterTypes.add (Place.TYPE_ESTABLISHMENT); Places.GeoDataApi.getAutocompletePredictions (mGoogleApiClient, spørring, grenser, AutocompleteFilter.create (filterTypes)) .setResultCallback (new ResultCallback () @Overvrid offentlig tomgang onResult (AutocompletePredictionBuffer buffer) hvis (buffer == null) returnere; hvis (buffer.getStatus (). isSuccess ()) for (AutocompletePrediction prediction: buffer) // Legg til som nytt element for å unngå IllegalArgumentsException når buffer frigjøres legg til (ny AutoCompletePlace (prediction.getPlaceId (), prediction.getDescription ))); // Forhindre minnelekkasje ved å slippe buffer buffer.release (); , 60, TimeUnit.SECONDS);
Innholdet i AutoCompleteAdapter
vises ved hjelp av a android.R.layout.simple_list_item_1
layout og standard ViewHolder mønster i getView
.
@Override public Vis getView (int posisjon, View convertView, ViewGroup forelder) ViewHolder holder; hvis (convertView == null) holder = new ViewHolder (); convertView = LayoutInflater.from (getContext ()) .flett (android.R.layout.simple_list_item_1, foreldre, falsk); holder.text = (TextView) convertView.findViewById (android.R.id.text1); convertView.setTag (holder); ellers holder = (ViewHolder) convertView.getTag (); holder.text.setText (getItem (posisjon) .getDescription ()); returnere konvertereView;
Når et element klikkes fra denne listen, er IDen til den valgte Sted
er sendt til onItemClickedListener
og søkte etter å vise.
Den siste delen av denne opplæringen dekker å finne en Sted
objekt basert på sin ID. Dette fungerer på samme måte som de andre API-anropene ved å opprette en PendingIntent
og samhandler med en returnert buffer for å hente stedet. Som de andre bufferobjektene du har jobbet med, har PlaceBuffer
må ringe utgivelse
for å unngå hukommelse lekkasjer.
privat ugyldig finner stedByById (String id) if (TextUtils.isEmpty (id) || mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) returnere; Places.GeoDataApi.getPlaceById (mGoogleApiClient, id) .setResultCallback (nytt resultatCallback() @Overtrid offentlig tomgang påResultat (PlaceBuffer steder) if (places.getStatus (). IsSuccess ()) Sted sted = places.get (0); displayPlace (sted); mPredictTextView.setText (""); mAdapter.clear (); // Slett PlaceBuffer for å forhindre at et minne lekker places.release (); );
Steds-API er et kraftig verktøy for å gjøre appene dine klar over brukerens sted for å gi dem kontekstuell informasjon. I denne opplæringen har du lært hvordan du bruker Place Picker-komponenten, gjette brukerens sted, presentere dem med prediktive resultater når du søker, og finn et sted basert på en gitt ID. I tillegg til temaene dekket her, er det også mulig å sende inn nye steder til Google for å utvide informasjonen APIen har tilgang til.