Google Play-Dienste Verwenden der Places-API

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.

1. Inbetriebnahme

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ätLebenszyklus. Wir machen das im onCreateam 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 (); 

2. Verwenden des Place Picker Widget

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

3. Suchen des aktuellen Ortes des Benutzers

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

4. Vorhersage von Orten

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

5. Suche nach einem Ort anhand der ID

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

Fazit

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.