Google Play Services Bruke Steds-API

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.

1. Komme i gang

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 Aktivitetlivssyklus. Vi gjør dette i onCreateonStart, 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 (); 

2. Bruke Place Picker Widget

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

3. Finne brukerens nåværende sted

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 () PendingResult result = 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 (); ); 

4. Forutsi steder

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 List filterTypes = 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.

5. Søker etter et sted etter ID

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 (); ); 

Konklusjon

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.