Î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.
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. Activitate
ciclul de viață. Noi facem asta în onCreate
, onStart
, ș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 ();
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);
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 () PendingResultrezultat = 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 (); );
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.
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 (); );
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.