Im März 2015 hat Google die Places-API für Android als Teil der Play Services von Google veröffentlicht. Mithilfe dieser API können Entwickler auf eine Vielzahl von Informationen von Google zugreifen, um Benutzern eine auf ihren aktuellen Standort zugeschnittene Erfahrung zu bieten, indem sie die Namen und Informationen von Orten anstelle von Koordinaten verwenden.
In diesem Lernprogramm erfahren Sie, wie Sie Ihren Benutzern die Ortsauswahl-Komponente präsentieren, mit der Places-API den aktuellen Standort des Benutzers ermitteln, nach einem Ort anhand seiner ID suchen und dem Benutzer die Eingabe in ein Textfeld ermöglichen, um ihn anzuzeigen mit vorhersagenden Ergebnissen.
Wenn Sie noch nicht über einen öffentlichen Android-API-Schlüssel verfügen, müssen Sie einen öffentlichen Google-API-Schlüssel für Android-Anwendungen erstellen. Sie können dies tun, indem Sie die Entwicklerkonsole von Google besuchen. Anweisungen zum Erstellen eines Schlüssels basierend auf Ihrem Signaturzertifikat und dem Paketnamen finden Sie in der Dokumentation von Google und gehen über den Rahmen dieses Artikels hinaus.
Wenn Sie einen Schlüssel erstellt haben, suchen Sie nach der Places-API und setzen Sie ihn auf aktiviert. Bei einigen Aufrufen der Places-API ist die Anzahl der Anfragen pro 24-Stunden-Zeitraum begrenzt. Zum Zeitpunkt des Schreibens kann ein Konto ohne Rechnungsprofil bis zu 1.000 Anforderungen senden, während ein Konto mit Rechnungsprofil 150.000 Anforderungen senden kann. Wenn Sie mehr benötigen, können Sie eine Anforderung zur Erhöhung dieses Grenzwerts einreichen, wie in der Dokumentation der Verwendungsgrenzwerte beschrieben.
Wenn der API-Schlüssel einsatzbereit ist, können Sie mit der Arbeit am Demoprojekt beginnen. Erstellen Sie ein Projekt in Android Studio, und legen Sie die mindestens unterstützte SDK-Version auf mindestens 9 fest. Dies ist die Mindestvoraussetzung für die Verwendung der Google Play-Dienste.
Sobald Android Studio das erstellt hat Hallo Welt Vorlagenprojekt öffnen Sie die build.gradle Datei und unter Abhängigkeiten
Knoten, fügen Sie die erforderliche Abhängigkeit von Play Services 7.0 hinzu. Dies ist der späteste Stand zum Zeitpunkt des Schreibens. Sie können die aktuelle Version jedoch anhand der Dokumentation von Google überprüfen.
Abhängigkeiten compile fileTree (Verzeichnis: 'libs', include: ['* .jar']) compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.google.android.gms: play-services : 7.0.0 '
Als nächstes öffnen AndroidManifest.xml, Fügen Sie die erforderlichen Berechtigungen für das Projekt hinzu, und geben Sie an, dass OpenGL Version 2 für die Anwendung erforderlich ist.
Das letzte, was Sie im Manifest tun müssen, ist das Hinzufügen von zwei
Tags zum Festlegen der gms-Version und des API-Schlüssels für die App im
Etikett.
Wenn Sie mit dem Manifest fertig sind, können Sie mit dem Schreiben von Code beginnen. Da dies eine Komponente von Play Services ist, müssen Sie Ihre GoogleApiClient
und verbinden / trennen Sie es während Ihres Aktivität
Lebenszyklus. Wir machen das im onCreate
, am Start
, und onStop
Methoden der Aktivität
Klasse.
@Override protected void onCreate (Bundle savedInstanceState) // - Snippet mGoogleApiClient = new GoogleApiClient .Builder (this) .enableAutoManage (this, 0, this) .addApi (Places.GEO_DATA_API) .addApi (Places.PLACE_DET_ADI). this) .addOnConnectionFailedListener (this) .build (); @Override protected void onStart () super.onStart (); if (mGoogleApiClient! = null) mGoogleApiClient.connect (); @Override protected void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect (); super.onStop ();
Das Place Picker-Widget ist eine von Play Services bereitgestellte Benutzeroberflächenkomponente, mit der der Benutzer eine Karte seiner Umgebung anzeigen kann. Die Komponente enthält eine Liste von Orten in der Nähe, die von Ihrer App verwendet werden können. Durch die Verwendung dieser Komponente können Sie einem Standarddesign folgen, mit dem Ihre Benutzer wissen, wie sie interagieren sollen, und gleichzeitig Entwicklungszeit sparen können.
Um die Ortsauswahl verwenden zu können, müssen Sie eine Absicht erstellen und darauf achten Aktivität
Ergebnis, um den vom Benutzer ausgewählten Ort abzurufen. Die folgende Methode zeigt, wie Sie dies starten Aktivität
.
private void displayPlacePicker () if (mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) return; PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder (); try startActivityForResult (builder.build (getApplicationContext ()), PLACE_PICKER_REQUEST); catch (GooglePlayServicesRepairableException) Log.d ("PlacesAPI-Demo", "GooglePlayServicesRepairableException geworfen"); catch (GooglePlayServicesNotAvailableException e) Log.d ("PlacesAPI-Demo", "GooglePlayServicesNotAvailableException geworfen");
Das PlacePicker.IntentBuilder
wird verwendet, um das zu erstellen Absicht
Damit wird der Place Picker gestartet. Es steht auch eine Methode zur Verfügung, setLatLngBounds
, Auf diese Weise können Sie eine geografische Grenze von einer Südwestecke zu einer Nordostecke platzieren, um das Suchgebiet zu steuern.
Das Absicht
kann mit dem gebaut werden bauen
Methode aus PlacePicker.IntentBuilder
und mit dem gestartet startActivityForResult
Methode von Ihrem Aktivität
. Es sei darauf hingewiesen, dass die Verwendung der bauen
Methode hat die Möglichkeit, eine zu werfen GooglePlayServicesRepairableException
oder ein GooglePlayServicesNotAvailableException
Ausnahmen, also sollten diese auf die Verwendung eines Standard-Try / Catch-Blocks geprüft und im Fall ihres Auftretens ordnungsgemäß behandelt werden.
Wenn der Benutzer einen Ort aus der Ortsauswahlliste auswählt, wird dies angezeigt Platz
Objekt wird in ein gepackt Absicht
und an den rufenden zurückgeschickt Aktivität
. Verwendung der PlacePicker.getPlace
Methode können Sie das extrahieren Platz
Daten von den zurückgegebenen Absicht
.
protected void onActivityResult (int requestCode, int resultCode, beabsichtigte Daten) if (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) displayPlace (PlacePicker.getPlace (data, this));
Einmal die Platz
Objekt extrahiert wird, kann es als Modellobjekt behandelt werden, das in Ihrer App angezeigt oder verwendet werden kann.
private void displayPlace (Ort platzieren) if (Ort == null) return; String content = ""; if (! TextUtils.isEmpty (place.getName ())) content + = "Name:" + place.getName () + "\ n"; if (! TextUtils.isEmpty (place.getAddress ())) content + = "Address:" + place.getAddress () + "\ n"; if (! TextUtils.isEmpty (place.getPhoneNumber ())) content + = "Phone:" + place.getPhoneNumber (); mTextView.setText (Inhalt);
Eine weitere interessante Funktion der Places-API ist, dass Sie mit dieser Funktion erraten können, ob sich der Benutzer gerade an einem aufgelisteten Ort befindet. Die API bietet auch eine Wahrscheinlichkeit, dass Sie fundierte Entscheidungen darüber treffen können, wie Ihre App mit dem Benutzer interagieren soll. Es sollte beachtet werden, dass dies eine der Funktionen der API ist, die eine Anforderung für Ihre zugewiesenen Verwendungen erfordert.
Um den Ort des Benutzers zu erkennen, müssen Sie die Places.PlacesDetectionApi.getCurrentPlace
Methode zum Erstellen eines PendingIntent
das kehrt mit einem zurück PlaceLikelihoodBuffer
Objekt. Verwendung einer ResultCallBack
, Sie können den ersten und wahrscheinlichsten Platz aus dem Puffer nehmen und in Ihrer App verwenden.
Wenn Ihre App weitere Informationen benötigt, können Sie weitere extrahieren PlaceLikelihood
Elemente aus dem Puffer durchlaufen. Die Wahrscheinlichkeit, dass sich dieser Ort an dem Ort befindet, an dem sich der Benutzer aktuell befindet, wird in jedem Ort zurückgegeben PlaceLikelihood
Objekt als Gleitkommawert aus 0,0 zu 1,0, 1,0 fast ein garantiertes Spiel. Vergiss nicht anzurufen Veröffentlichung
auf der PlaceLikelihoodBuffer
um Speicherlecks zu vermeiden.
private void guessCurrentPlace () PendingResultresult = Places.PlaceDetectionApi.getCurrentPlace (mGoogleApiClient, null); result.setResultCallback (neuer ResultCallback () @Override public void onResult (PlaceLikelihoodBuffer wahrscheinlichPlaces) PlaceLikelihood placeLikelihood = wahrscheinlichPlaces.get (0); String content = ""; if (placeLikelihood! = null && placeLikelihood.getPlace ()! = null &&! TextUtils.isEmpty (placeLikelihood.getPlace (). getName ())) content = "Am wahrscheinlichsten Ort:" + placeLikelihood.getPlace (). getName () + "\ n"; if (placeLikelihood! = null) content + = "Prozentuale Veränderung des Vorhandenseins:" + (int) (placeLikelihood.getLikelihood () * 100) + "%"; mTextView.setText (Inhalt); wahrscheinlichPlaces.release (); );
Das nächste und komplexeste Thema, auf das wir in diesem Lernprogramm eingehen, ist die Vorhersage und Anzeige von Orten für den Benutzer, wenn er eine Suchabfrage eingibt. Auch dieser API-Aufruf gilt für die Nutzungsgrenzen der API. Es ist jedoch von unschätzbarem Wert, um Ihre App nutzbarer zu machen.
Für diesen Teil des Tutorials verwenden Sie ein AutoCompleteTextView
und einen benutzerdefinierten Adapter in der App, um den Namen eines Orts für Vorhersagen einzugeben. Fast alle Arbeiten werden im Adapter erledigt. Wir müssen jedoch einen Verweis auf die GoogleApiClient
an den Adapter, damit er auf die API zugreifen kann.
Dies kann im Standard erfolgen GoogleApiClient
Ruf zurück, onConnected
, und wir können die Instanz des Clients in entfernen onStop
woher mAdapter
ist ein Beispiel unserer Gewohnheit Adapter
Klasse, AutoCompleteAdapter
.
@Override protected void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mAdapter.setGoogleApiClient (null); mGoogleApiClient.disconnect (); super.onStop (); @Override public void onConnected (Bundle-Paket) if (mAdapter! = Null) mAdapter.setGoogleApiClient (mGoogleApiClient);
Einen API-Aufruf auslösen, wenn der Benutzer einen neuen Buchstaben in AutoCompleteTextView
, Sie müssen das überschreiben getFilter
Methode der ArrayAdapter
. Diese Methode wird ausgelöst, wenn der Benutzer den Inhalt der mit dem Adapter verknüpften Ansicht ändert. Damit können Sie den Inhalt des Adapters von ändern AutoCompleteTextView
. Im folgenden Beispiel, Einschränkungen
ist der Inhalt der Ansicht.
@Override public Filter getFilter () return new Filter () @Override protected FilterResults PerformFiltering (CharSequence-Einschränkung) if (mGoogleApiClient == null ||! MGoogleApiClient.isConnected ()) Toast.makeText (getContext ()), "nicht verbunden ", Toast.LENGTH_SHORT) .show (); null zurückgeben; klar(); displayPredictiveResults (constraint.toString ()); null zurückgeben; @Override protected void publishResults (CharSequence-Einschränkung, FilterResults-Ergebnisse) notifyDataSetChanged (); ;
Das displayPredictiveResults
Methode ist, wo die eigentliche Interaktion mit der API stattfindet. Es gibt verschiedene Objekte, mit denen Sie Ihre Vorhersagen anpassen können.
Der erste ist ein LatLngBounds
Objekt, das eine quadratische Grenze von einem Südwestpunkt zu einem Nordostpunkt erstellt, um die Abfrage zu lokalisieren. Ob Null
wird statt eines initialisierten übergeben LatLngBounds
Objekt, dann werden keine geographischen Einschränkungen für die Abfrage festgelegt.
LatLngBounds-Grenzen = neue LatLngBounds (neue LatLng (39.906374, -105.122337), neue LatLng (39.949552, -105.068779));
Das zweite Objekt, das Sie zum Anpassen der Abfrage erstellen können, ist ein Filter für die API-Anforderung. Der Filter für die Setzt
AutoCompletePredictions
Anruf ist eine Liste von Ganze Zahl
Objekte, die verschiedene Arten von Filtern darstellen. Zu diesem Zeitpunkt kann nur ein Filtertyp auf eine Abfrage angewendet werden. Die akzeptablen Werte finden Sie in der Dokumentation. Wenn die Ganze Zahl
Liste ist leer oder Null
übergeben wird, werden alle Ergebnistypen zurückgegeben.
Sobald Sie bereit sind, die Anfrage zu stellen, können Sie das verwenden Places.GeoDataApi.getAutocompletePredictions
Methode zur Rückgabe a PendingIntent
, die mit einem verbunden werden kann ResultCallback
um die zurückgegebenen Informationen anzuzeigen.
Es ist wichtig zu beachten, dass ein benutzerdefiniertes Objekt das darstellt AutoCompletePrediction
Objekte aus dem Puffer werden zum Speichern der Daten in der Datenbank verwendet ArrayAdapter
. Ansonsten ein IllegalArgumentsException
Eine Ausnahme wird ausgelöst, sobald der Puffer freigegeben wird. Dies ist entscheidend, um einen Speicherverlust zu vermeiden.
private void displayPredictiveResults (String-Abfrage) // Südwestecke zur Nordostecke. LatLngBounds-Grenzen = neue LatLngBounds (neue LatLng (39.906374, -105.122337), neue LatLng (39.949552, -105.068779)); // Filter: https://developers.google.com/places/supported_types#table3 ListefilterTypes = neue ArrayList (); filterTypes.add (Place.TYPE_ESTABLISHMENT); Places.GeoDataApi.getAutocompletePredictions (mGoogleApiClient, Abfrage, Begrenzungen, AutocompleteFilter.create (filterTypes)) .setResultCallback (neuer ResultCallback () @Override public void onResult (AutocompletePredictionBuffer-Puffer) if (buffer == null) return; if (buffer.getStatus (). isSuccess ()) for (Vorhersagen für AutocompletePrediction: buffer) // Als neues Element hinzufügen, um IllegalArgumentsException zu vermeiden, wenn Puffer freigegeben wird. ))); // Verhindern Sie Speicherverlust, indem Sie Pufferpuffer freigeben. Release (); , 60, TimeUnit.SECONDS);
Der Inhalt in AutoCompleteAdapter
wird mit a angezeigt android.R.layout.simple_list_item_1
Layout und Standard ViewHolder-Muster in getView
.
@Override public View getView (int position, View convertView, ViewGroup-übergeordnetes Element) ViewHolder-Inhaber; if (convertView == null) holder = new ViewHolder (); convertView = LayoutInflater.from (getContext ()) .inflate (android.R.layout.simple_list_item_1, übergeordnet, falsch); holder.text = (TextView) convertView.findViewById (android.R.id.text1); convertView.setTag (Besitzer); else holder = (ViewHolder) convertView.getTag (); holder.text.setText (getItem (position) .getDescription ()); return convertView;
Wenn Sie in dieser Liste auf ein Element klicken, wird die ID des ausgewählten Elements angezeigt Platz
wird an die übergeben onItemClickedListener
und gesucht, um anzuzeigen.
Der letzte Teil dieses Tutorials behandelt das Finden von a Platz
Objekt anhand seiner ID. Dies funktioniert ähnlich wie die anderen API-Aufrufe, indem a erstellt wird PendingIntent
und Interaktion mit einem zurückgegebenen Puffer, um den Ort abzurufen. Wie die anderen Pufferobjekte, mit denen Sie gearbeitet haben, die PlaceBuffer
muss anrufen Veröffentlichung
um Speicherlecks zu vermeiden.
private void findPlaceById (Zeichenfolge-ID) if (TextUtils.isEmpty (id) || mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) return; Places.GeoDataApi.getPlaceById (mGoogleApiClient, id) .setResultCallback (neues ResultCallback)() @Override public void onResult (PlaceBuffer places) if (places.getStatus (). IsSuccess ()) Place place = places.get (0); displayPlace (Ort); mPredictTextView.setText (""); mAdapter.clear (); // Geben Sie den PlaceBuffer frei, um ein Speicherleck zu verhindern. Places.release (); );
Die Places-API ist ein leistungsstarkes Tool, mit dem Sie Ihre Apps über den Standort des Benutzers informieren und ihnen Kontextinformationen zur Verfügung stellen können. In diesem Lernprogramm haben Sie gelernt, wie Sie die Ortsauswahlkomponente verwenden, die Position des Benutzers erraten, ihm bei der Suche vorhersagende Ergebnisse präsentieren und einen Ort anhand einer bestimmten ID suchen. Zusätzlich zu den hier behandelten Themen ist es auch möglich, neue Orte bei Google einzureichen, um die Informationen zu erweitern, auf die die API Zugriff hat.