Serviciile Google Play utilizând API-ul Locații

În martie 2015, Google a lansat API-ul Places pentru Android ca parte a serviciilor Google Play. Acest API permite dezvoltatorilor să acceseze o mulțime de informații de la Google pentru a oferi utilizatorilor o experiență adaptată locației lor curente, utilizând numele și informațiile locurilor, mai degrabă decât un set de coordonate.

În acest tutorial, veți afla cum să prezentați utilizatorilor dvs. componenta Picker Locație, utilizați API-ul Locații pentru a ghici locul curent al utilizatorului, căutați un loc după ID-ul acestuia și permiteți utilizatorului să introducă un câmp text pentru a-i prezenta cu rezultate predictive.

1. Obținerea setării

Dacă nu aveți deja o cheie API publică Android, va trebui să creați o cheie publică API Google pentru aplicații Android. Puteți face acest lucru vizitând Consola pentru dezvoltatori Google. Instrucțiunile pentru crearea unei chei pe baza certificatului dvs. de semnare și a numelui pachetului sunt disponibile în documentația Google și depășesc domeniul de aplicare al acestui articol.

Când ați creat o cheie, căutați API-ul Locații și setați-l la activat. Unele apeluri către API-urile Locații sunt limitate în câte solicitări pot fi trimise în 24 de ore. La momentul redactării, un cont fără un profil de facturare poate trimite până la 1.000 de solicitări în timp ce un cont cu un profil de facturare poate trimite 150.000 de solicitări. Dacă aveți nevoie de mai mult, puteți trimite o solicitare de a crește această limită așa cum este descris în documentația Limite de utilizare.

Cu tasta API gata de utilizat, este timpul să începeți să lucrați la proiectul demo. Creați un proiect în Android Studio și setați versiunea minimă SDK acceptată la cel puțin 9. Aceasta este cerința minimă pentru utilizarea serviciilor Google Play.

Odată ce Android Studio a creat Salut Lume șablon proiect, deschideți build.gradle fișier și, în conformitate cu dependențe nod, adăugați dependența necesară serviciului Play 7.0. Acesta este cel mai recent la momentul redactării, dar puteți verifica ultima versiune verificând documentația Google.

dependente compile fileTree (dir: 'libs', include: ['* .jar']) compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.google.android.gms: play-services : 7.0.0 '

În continuare, deschideți-vă AndroidManifest.xml, adăugați permisiunile necesare pentru proiect și declară că versiunea 2 OpenGL este solicitată de către aplicație.

  

Ultimul lucru pe care trebuie să-l faci în manifeste este adăugarea a două pentru a seta versiunea GMS și cheia API pentru aplicație în cadrul etichetă.

 

Când ați terminat cu manifestul, sunteți gata să începeți să scrieți codul. Deoarece aceasta este o componentă din serviciile Play, va trebui să inițializați dvs. GoogleApiClient și conectați-l / deconectați-l în timpul dvs. Activitateciclul de viață. Noi facem asta în onCreateonStart, și onStop metode ale Activitate clasă.

@Override protejat void onCreate (Bundle savedInstanceState) // - Snippet mGoogleApiClient = nou GoogleApiClient .Builder (this) .enableAutoManage (this, 0, this) .addApi (Places.GEO_DATA_API) .addApi (Places.PLACE_DETECTION_API) .addConnectionCallbacks acest lucru) .addOnConnectionFailedListener (this) .build ();  @Override protejate void onStart () super.onStart (); dacă (mGoogleApiClient! = null) mGoogleApiClient.connect ();  @Override protejat void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect ();  super.onStop (); 

2. Folosind widgetul Place Picker

Widgetul Place Picker este o componentă de interfață cu utilizatorul furnizată de serviciile Play, care permite utilizatorului să vadă o hartă a zonei înconjurătoare. Componenta include o listă de locații din apropiere care pot fi utilizate de aplicația dvs. Prin utilizarea acestei componente, puteți urmări un design standard pe care utilizatorii dvs. vor ști cum să interacționeze, în timp ce pot salva în timpul de dezvoltare.

Pentru a utiliza selectorul de locație, trebuie să creați o intenție și să ascultați pentru Activitate rezultat pentru a prelua locația selectată de utilizator. Următoarea metodă arată cum ați lansa acest lucru Activitate.

private void displayPlacePicker () if (mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) retur; Generatorul PlacePicker.IntentBuilder = noul PlacePicker.IntentBuilder (); încercați startActivityForResult (builder.build (getApplicationContext ()), PLACE_PICKER_REQUEST);  captură (GooglePlayServicesRepairableException e) Log.d ("Demonstrații pe LocațiiAPI", "GooglePlayServicesRepairableException aruncate");  captură (GooglePlayServicesNotAvailableException e) Log.d ("Demonstrarea locațiilorAPI", "GooglePlayServicesNotAvailableException aruncată"); 

 PlacePicker.IntentBuilder este folosit pentru a crea scop care va fi utilizată pentru a lansa selectorul de locație. De asemenea, are o metodă disponibilă, setLatLngBounds, care vă permite să plasați o limită geografică dintr-un colț de sud-vest într-un colț nord-est pentru a controla zona de căutare.

 scop poate fi construit folosind construi metoda de la PlacePicker.IntentBuilder și a lansat utilizând startActivityForResult metoda de la dvs. Activitate. Trebuie remarcat faptul că utilizarea construi metoda are posibilitatea de a arunca o GooglePlayServicesRepairableException sau a GooglePlayServicesNotAvailableException excepție, astfel încât acestea ar trebui să fie verificate pentru utilizarea unui bloc standard de încercare / captură și manipulate grațios în cazul în care acestea apar.

Dacă utilizatorul selectează o locație din lista de selectatori de locație, aceasta Loc obiect este ambalat într-un scop și trimis înapoi la chemare Activitate. Utilizarea PlacePicker.getPlace metoda, puteți extrage Loc date din partea returnată scop.

protejate void onActivityResult (int requestCode, int resultCode, date de intenție) if (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) displayPlace (PlacePicker.getPlace (date, this)); 

Odata ce Loc obiectul este extras, acesta poate fi tratat ca un obiect model pentru a fi afișat sau utilizat în aplicația dvs..

private void displayPlace (locul locului) if (loc == null) retur; Conținut de coarde = ""; dacă ! TextUtils.isEmpty (place.getName ())) content + = "Nume:" + place.getName () + "\ n";  dacă ! TextUtils.isEmpty (place.getAddress ())) content + = "Adresa:" + place.getAddress () + "\ n";  dacă ! TextUtils.isEmpty (place.getPhoneNumber ())) content + = "Telefon:" + place.getPhoneNumber ();  mTextView.setText (conținut); 

3. Găsirea locului curent al utilizatorului

O altă caracteristică interesantă a locației API este că o puteți utiliza pentru a ghici dacă utilizatorul se află în prezent la un loc listat. API va oferi, de asemenea, o probabilitate, astfel încât să puteți lua decizii informate cu privire la modul în care aplicația ar trebui să interacționeze cu utilizatorul. Trebuie remarcat faptul că aceasta este una dintre caracteristicile API care necesită o cerere împotriva utilizărilor dvs. alocate.

Pentru a detecta locul utilizatorului, va trebui să utilizați Places.PlacesDetectionApi.getCurrentPlace metoda de a crea un PendingIntent care se întoarce cu a PlaceLikelihoodBuffer obiect. Folosind un ResultCallBack, puteți lua primul și cel mai probabil loc din tampon și utilizați-l în aplicația dvs..

Dacă aplicația dvs. are nevoie de mai multe informații, puteți extrage altele PlaceLikelihood elemente din memoria tampon prin looping prin ea. Probabilitatea ca acest loc să fie localizat în prezent este trecut înapoi în fiecare PlaceLikelihood obiect ca valoare punct de variație de la 0.0 la 1.0, 1.0 fiind aproape un meci garantat. Nu uita să suni eliberare pe PlaceLikelihoodBuffer pentru a evita scurgeri de memorie.

private void guessCurrentPlace () PendingResult rezultat = Places.PlaceDetectionApi.getCurrentPlace (mGoogleApiClient, null); result.setResultCallback (noul ResultCallback() @Override public void peResult (PlaceLikelihoodBuffer probablePlaces) PlaceLikelihood placeLikelihood = probabilPlaces.get (0); Conținut de coarde = ""; dacă (locLikelihood! = null && placeLikelihood.getPlace ()! = null &&! TextUtils.isEmpty (placeLikelihood.getPlace (). getName ())) content = "Locul cel mai probabil: + "\ n"; dacă (locLikelihood! = null) conținut + = "Procentul schimbării fiind acolo:" + (int) (locLikelihood.getLikelihood () * 100) + "%"; mTextView.setText (conținut); likelyPlaces.release (); ); 

4. Predicarea Locurilor

Următorul și cel mai complex subiect pe care îl vom examina în acest tutorial este prezicerea și afișarea locurilor către utilizator în momentul în care intră într-o interogare de căutare. Din nou, acest apel API contează și pentru limitele de utilizare ale API. Cu toate acestea, este de neprețuit pentru a face aplicația mai utilizabilă.

Pentru această parte a tutorialului, veți folosi un AutoCompleteTextView și un adaptor personalizat în aplicație pentru a introduce numele unui loc pentru predicții. Aproape toata munca se face in adaptor. Cu toate acestea, va trebui să trimitem o trimitere la GoogleApiClient la adaptor pentru a accesa API-ul.

Acest lucru se poate face în standard GoogleApiClient suna inapoi, onConnected, și putem elimina instanța clientului în onStop Unde mAdapter este o instanță a obiceiului nostru  adaptor clasă, AutoCompleteAdapter.

@Override protejată void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mAdapter.setGoogleApiClient (null); mGoogleApiClient.disconnect ();  super.onStop ();  @Override public void onConnected (Bundle bundle) dacă (mAdapter! = Null) mAdapter.setGoogleApiClient (mGoogleApiClient); 

Pentru a declanșa un apel API ori de câte ori utilizatorul introduce o nouă literă în AutoCompleteTextView, trebuie să înlocuiți getFilter metodă a ArrayAdapter. Această metodă este declanșată de fiecare dată când utilizatorul modifică conținutul vizualizării asociate adaptorului. Vă permite să modificați conținutul adaptorului AutoCompleteTextView. În exemplul următor, constrângeri este conținutul opiniei.

@Override public Filter getFilter () returnează filtrul nou () @Override protejat FilterResults performFiltering (CharSequence constraint) if (mGoogleApiClient == null ||! MGoogleApiClient.isConnected ()) Toast.makeText (getContext conectat ", Toast.LENGTH_SHORT) .show (); retur nul;  clar(); displayPredictiveResults (constraint.toString ()); retur nul;  @Override protejate void publishResults (constrângere CharSequence, rezultate FilterResults) notifyDataSetChanged (); ; 

displayPredictiveResults metoda este locul în care are loc interacțiunea efectivă cu API. Există câteva obiecte diferite care pot fi făcute pentru a vă personaliza previziunile.

Primul este a LatLngBounds obiect care creează o limită pătrată de la un punct de sud-vest spre un punct nord-estic pentru a localiza interogarea. Dacă nul este trecut în loc de un inițializat LatLngBounds obiect, atunci nu vor fi introduse restricții geografice în interogare.

Limitele LatLngBounds = LatLngBounds noi (LatLng nou (39.906374, -105.122337), LatLng nou (39.949552, -105.068779));

Al doilea obiect pe care îl puteți crea pentru a personaliza interogarea este un filtru pentru solicitarea API. Filtrul pentru Locuri AutoCompletePredictions apel este o listă de Întreg obiecte reprezentând diferite tipuri de filtre. În acest moment, la o interogare poate fi aplicat un singur tip de filtru. Valorile acceptabile pot fi găsite în documentație. În cazul în care Întreg lista este goală sau nul este trecut, atunci toate tipurile de rezultate sunt returnate.

Odată ce sunteți gata să faceți cererea, puteți utiliza funcția Places.GeoDataApi.getAutocompletePredictions metoda de returnare a PendingIntent, care poate fi asociat cu o ResultCallback pentru a afișa informațiile returnate.

Este important să rețineți că un obiect personalizat reprezentând AutoCompletePrediction obiecte din memoria tampon sunt folosite pentru a stoca datele în ArrayAdapter. În caz contrar IllegalArgumentsException excepția ar fi aruncată imediat ce tamponul este eliberat, ceea ce este esențial pentru a evita o scurgere de memorie.

private void displayPredictiveResults (interogare cu șir) // Centru de sud-vest către colțul nord-est. Limitele LatLngBounds = LatLngBounds noi (LatLng nou (39.906374, -105.122337), LatLng nou (39.949552, -105.068779)); // Filtrați: https://developers.google.com/places/supported_types#table3 Listă filterTypes = noul ArrayList(); filterTypes.add (Place.TYPE_ESTABLISHMENT); Places.GeoDataApi.getAutocompletePredictions (mGoogleApiClient, interogare, limite, AutocompleteFilter.create (filterTypes)) .setResultCallback (new ResultCallback() @Override public void onResult (bufferul AutocompletePredictionBuffer) if (buffer == null) retur; if (buffer.getStatus () isSuccess ()) pentru (predicție autocompletePredicție: buffer) // Adăugați ca un element nou pentru a evita IllegalArgumentsException când bufferul este eliberat adăugați (predictive.getPlaceId (predictive.getPlaceId (predictive.getDescription )));  // Prevenirea pierderii de memorie prin eliberarea buffer buffer.release (); , 60, TimeUnit.SECONDS); 

Conținutul în AutoCompleteAdapter este afișat utilizând a android.R.layout.simple_list_item_1 aspectul și modelul standard ViewHolder din getView.

@Override public Vizualizare getView (pozitie int, Vizualizare convertView, ViewGroup parent) ViewHolder holder; dacă (convertView == null) holder = noul ViewHolder (); convertView = LayoutInflater.from (getContext ()) .inflate (android.R.layout.simple_list_item_1, părinte, fals); suportul.text = (TextView) convertView.findViewById (android.R.id.text1); convertView.setTag (suport);  altceva holder = (ViewHolder) convertView.getTag ();  hold.text.setText (getItem (position) .getDescription ()); retur convertView; 

Când faceți clic pe un element din această listă, identificatorul selectat Loc este trecut la onItemClickedListener și căutat pentru afișare.

5. Căutarea unui loc după ID

Partea finală a acestui tutorial acoperă găsirea unui Loc obiect bazat pe ID-ul său. Aceasta funcționează în mod similar cu celelalte apeluri API prin crearea unui PendingIntent și interacționează cu un tampon returnat pentru a prelua locul. Ca și celelalte obiecte tampon cu care ați lucrat,  PlaceBuffer trebuie să sune eliberare pentru a evita scurgeri de memorie.

void privat findPlaceById (id șir) if (TextUtils.isEmpty (id) || mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) retur; Places.GeoDataApi.getPlaceById (mGoogleApiClient, id) .setResultCallback (noul ResultCallback() @Override public void peResult (locurile PlaceBuffer) if (places.getStatus () .isSuccess ()) Place place = places.get (0); displayPlace (loc); mPredictTextView.setText (""); mAdapter.clear ();  // Eliberați PlaceBuffer pentru a preveni scurgeri de memorie places.release (); ); 

Concluzie

API-ul Locații este un instrument puternic pentru a face aplicațiile dvs. conștiente de locația utilizatorului pentru a le oferi informații contextuale. În acest tutorial, ați învățat cum să utilizați componenta Place Picker, ghiciți locul utilizatorului, prezentați-i rezultate predictive atunci când căutați și găsiți un loc bazat pe un ID dat. În plus față de subiectele acoperite aici, este posibil să trimiteți noi locuri la Google pentru a ajuta la extinderea informațiilor la care are acces accesul API.

Cod