Services Google Play Utilisation de l'API Places

En mars 2015, Google a publié l'API Places pour Android dans le cadre des services de lecture de Google. Cette API permet aux développeurs d'accéder à une mine d'informations de Google pour offrir aux utilisateurs une expérience adaptée à leur emplacement actuel en utilisant les noms et les informations des lieux, plutôt qu'un ensemble de coordonnées..

Dans ce didacticiel, vous apprendrez à présenter à vos utilisateurs le composant de sélecteur de lieu, à utiliser l’API Lieux à deviner le lieu actuel de l’utilisateur, à rechercher un lieu par son ID et à lui permettre de taper dans un champ de texte pour le présenter. avec des résultats prédictifs.

1. Mise en place

Si vous ne possédez pas déjà de clé API publique Android, vous devrez créer une clé API Google publique pour les applications Android. Vous pouvez le faire en visitant la console des développeurs de Google. Les instructions pour créer une clé basée sur votre certificat de signature et le nom du package sont disponibles dans la documentation de Google et sortent du cadre de cet article..

Lorsque vous avez créé une clé, recherchez l'API Places et configurez-la sur activé. Certains appels à l'API Places sont limités en nombre de demandes pouvant être envoyées par période de 24 heures. Au moment de la rédaction de ce document, un compte sans profil de facturation peut envoyer jusqu'à 1 000 demandes, tandis qu'un compte doté d'un profil de facturation peut envoyer 150 000 demandes. Si vous avez besoin de plus, vous pouvez soumettre une demande pour que cette limite soit augmentée comme décrit dans la documentation sur les limites d'utilisation..

Avec la clé API prête à être utilisée, il est temps de commencer à travailler sur le projet de démonstration. Créez un projet dans Android Studio et définissez la version minimale du SDK pris en charge sur 9. Il s'agit de la configuration minimale requise pour utiliser les services de lecture de Google..

Une fois qu'Android Studio a créé le Bonjour le monde modèle de projet, ouvrez le build.gradle déposer et, sous la les dépendances noeud, ajoutez la dépendance requise de Play Services 7.0. Il s’agit de la version la plus récente au moment de la rédaction, mais vous pouvez vérifier la dernière version en consultant la documentation de Google..

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

Ensuite, ouvrez AndroidManifest.xml, ajoutez les autorisations requises pour le projet et indiquez qu'OpenGL version 2 est requise par l'application.

  

La dernière chose à faire dans le manifeste est d’ajouter deux balises pour définir la version de gms et la clé d’API de l’application dans le étiquette.

 

Lorsque vous avez terminé avec le manifeste, vous êtes prêt à commencer à écrire du code. Comme il s’agit d’un composant de Play Services, vous devrez initialiser votre GoogleApiClient et connectez / déconnectez-le pendant votre Activitéle cycle de vie de. Nous faisons cela dans le onCreateonStart, et onStop méthodes de la Activité classe.

@Override protected void onCreate (Bundle savedInstanceState) // - Snippet mGoogleApiClient = new GoogleApiClient .Builder (this) .enableAutoManage (this, 0, this) .addApi (Places.GEO_DATA_API) .addApi (Places.GEA) .addApi (Places.GEA) 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. Utilisation du widget Place Picker

Le widget Place Picker est un composant d'interface utilisateur fourni par Play Services qui permet à l'utilisateur de voir une carte de ses environs. Le composant inclut une liste des lieux à proximité pouvant être utilisés par votre application. En utilisant ce composant, vous êtes en mesure de suivre une conception standard avec laquelle vos utilisateurs sauront interagir tout en économisant du temps de développement..

Pour utiliser le sélecteur de lieu, vous devez créer une intention et écouter les Activité résultat pour récupérer le lieu sélectionné par l'utilisateur. La méthode suivante montre comment lancer cette Activité.

void privé displayPlacePicker () if (mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) return; Générateur PlacePicker.IntentBuilder = nouveau PlacePicker.IntentBuilder (); try startActivityForResult (builder.build (getApplicationContext ()), PLACE_PICKER_REQUEST);  catch e (e) Log.d ("PlacesAPI Demo", "GooglePlayServicesRepairableException levée");  catch (e) Log.d ("Demo PlacesAPI", "GooglePlayServicesNotAvailableException levée"); 

le PlacePicker.IntentBuilder est utilisé pour créer le Intention qui sera utilisé pour lancer le sélecteur de lieu. Il a aussi une méthode disponible, setLatLngBounds, qui vous permet de placer une limite géographique d'un angle sud-ouest à un angle nord-est pour contrôler la zone de recherche.

le Intention peut être construit en utilisant le construire méthode de PlacePicker.IntentBuilder et lancé en utilisant le startActivityForResult méthode de votre Activité. Il convient de noter que l’utilisation de la construire méthode a la possibilité de jeter un GooglePlayServicesRepairableException ou un GooglePlayServicesNotAvailableException exception, donc ceux-ci doivent être vérifiés à l'aide d'un bloc try / catch standard et traités avec élégance s'ils se produisent.

Si l’utilisateur sélectionne un emplacement dans la liste de sélection d’emplacement, il Endroit objet est emballé dans un Intention et renvoyé à l'appel Activité. En utilisant le PlacePicker.getPlace méthode, vous pouvez extraire le Endroit données du retour Intention.

Void protégé onActivityResult (int requestCode, int resultCode, données d'intention) if (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) displayPlace (PlacePicker.getPlace (data, this)); 

Une fois la Endroit l'objet est extrait, il peut être traité comme un objet modèle à afficher ou à utiliser dans votre application..

private void displayPlace (Place lieu) if (place == null) return; String content = ""; if (! TextUtils.isEmpty (place.getName ())) content + = "Nom:" + lieu.getName () + "\ n";  if (! TextUtils.isEmpty (place.getAddress ())) content + = "Address:" + place.getAddress () + "\ n";  if (! TextUtils.isEmpty (place.getPhoneNumber ())) content + = "Phone:" + place.getPhoneNumber ();  mTextView.setText (content); 

3. Trouver le lieu actuel de l'utilisateur

Une autre caractéristique intéressante de l’API Lieux est que vous pouvez l’utiliser pour déterminer si l’utilisateur se trouve actuellement à un emplacement répertorié. L'API vous permettra également de prendre des décisions éclairées sur la manière dont votre application devrait interagir avec l'utilisateur. Il convient de noter qu'il s'agit d'une des fonctionnalités de l'API qui nécessite une requête vis-à-vis de vos utilisations allouées..

Pour détecter l'emplacement de l'utilisateur, vous devez utiliser le Places.PlacesDetectionApi.getCurrentPlace méthode pour créer un En attente d'intention qui revient avec un PlaceLikelihoodBuffer objet. Utilisant un ResultCallBack, vous pouvez prendre le premier, et très probablement, place de la mémoire tampon et l'utiliser dans votre application.

Si votre application a besoin de plus d'informations, vous pouvez en extraire d'autres. PlaceLikelihood éléments de la mémoire tampon en boucle. La probabilité que cet endroit soit où se trouve actuellement l'utilisateur est renvoyée dans chaque PlaceLikelihood objet en tant que valeur en virgule flottante de 0.0 à 1,0, 1,0 être presque un match garanti. N'oubliez pas d'appeler Libération sur le PlaceLikelihoodBuffer éviter toute fuite de mémoire.

private void guessCurrentPlace () PendingResult resultat = Places.PlaceDetectionApi.getCurrentPlace (mGoogleApiClient, null); result.setResultCallback (nouveau ResultCallback() @Override public void onResult (PlaceLikelihoodBuffer probablePlaces) LieuLikelihood placeLikelihood = probablePlaces.get (0); String content = ""; if (placeLikelihood! = null && placeLikelihood.getPlace ()! = null &&! TextUtils.isEmpty (placeLikelihood.getPlace (). getName ())) content = "Lieu le plus probable:" + lieuLikelihood.getPlace (). getName () + "\ n"; if (placeLikelihood! = null) content + = "Pourcentage de changement de présence:" + (int) (placeLikelihood.getLikelihood () * 100) + "%"; mTextView.setText (contenu); probablePlaces.release (); ); 

4. Prévoir des lieux

Le sujet suivant, le plus complexe, que nous allons aborder dans ce didacticiel est la prédiction et l’affichage des lieux à l’utilisateur lorsqu’il saisit une requête de recherche. Encore une fois, cet appel d'API compte également dans les limites d'utilisation de l'API. Cependant, il est précieux pour rendre votre application plus utilisable.

Pour cette partie du didacticiel, vous utiliserez un AutoCompleteTextView et un adaptateur personnalisé dans l'application pour taper le nom d'un lieu pour les prédictions. Presque tout le travail est fait dans l'adaptateur. Cependant, nous devrons faire référence à la GoogleApiClient à l'adaptateur pour accéder à l'API.

Cela peut être fait dans la norme GoogleApiClient rappeler, onConnected, et nous pouvons supprimer l'instance du client onStop où mAdapter est un exemple de notre coutume  Adaptateur classe, AutoCompleteAdapter.

@Override protected void onStop () if (mGoogleApiClient! = Null && mGoogleApiClient.isConnected ()) mAdapter.setGoogleApiClient (null); mGoogleApiClient.disconnect ();  super.onStop ();  @Override public void onConnected (ensemble) if (mAdapter! = Null) mAdapter.setGoogleApiClient (mGoogleApiClient); 

Pour déclencher un appel d'API chaque fois que l'utilisateur tape une nouvelle lettre dans la liste. AutoCompleteTextView, vous devez remplacer le getFilter méthode du ArrayAdapter. Cette méthode est déclenchée chaque fois que l'utilisateur modifie le contenu de la vue associée à l'adaptateur. Il vous permet de modifier le contenu de l'adaptateur du AutoCompleteTextView. Dans l'exemple suivant, contraintes est le contenu de la vue.

@Override public Filter getFilter () retourne new Filter () @Override protected FilterResults performFiltering (contrainte CharSequence) if (mGoogleApiClient == null ||! MGoogleApiClient.isConnected ()) Toast.makeText (), get connecté ", Toast.LENGTH_SHORT) .show (); return null;  clear (); displayPredictiveResults (constraint.toString ()); return null;  @Override protected void publishResults (contrainte CharSequence, résultats FilterResults) notifyDataSetChanged (); ; 

le displayPredictiveResults La méthode correspond à l’interaction réelle avec l’API. Il existe différents objets pouvant être créés pour personnaliser vos prédictions..

Le premier est un LatLngBounds objet qui crée une limite carrée d'un point sud-ouest à un point nord-est pour localiser la requête. Si nul est passé au lieu d'un initialisé LatLngBounds objet, aucune restriction géographique ne sera appliquée à la requête.

LatLngBounds bounds = new LatLngBounds (new LatLng (39.906374, -105.122337), new LatLng (39.949552, -105.068779));

Le deuxième objet que vous pouvez créer pour personnaliser la requête est un filtre pour la demande d'API. Le filtre pour le Des endroits AutoCompletePredictions call est une liste de Entier objets représentant différents types de filtres. À ce stade, un seul type de filtre peut être appliqué à une requête. Les valeurs acceptables sont disponibles dans la documentation. Si la Entier la liste est vide ou nul est passé, tous les types de résultats sont retournés.

Une fois que vous êtes prêt à faire la demande, vous pouvez utiliser le Places.GeoDataApi.getAutocompletePredictions méthode pour retourner un En attente d'intention, qui peut être associé à un ResultCallback pour afficher les informations retournées.

Il est important de noter qu'un objet personnalisé représentant le AutoCompletePrediction les objets du tampon sont utilisés pour stocker les données dans le ArrayAdapter. Sinon un IllegalArgumentsException exception serait levée dès que le tampon est libéré, ce qui est crucial pour éviter une fuite de mémoire.

private void displayPredictiveResults (Requête sur chaîne) // Angle sud-ouest à angle nord-est. LatLngBounds bounds = new LatLngBounds (new LatLng (39.906374, -105.122337), new LatLng (39.949552, -105.068779)); // Filtre: https://developers.google.com/places/supported_types#table3 List filterTypes = new ArrayList(); filterTypes.add (Place.TYPE_ESTABLISHMENT); Places.GeoDataApi.getAutocompletePredictions (mGoogleApiClient, requête, limites, AutocompleteFilter.create (filterTypes)) .setResultCallback (nouveau ResultCallback() @Override public void onResult (tampon AutocompletePredictionBuffer) if (tampon == null) return; if (buffer.getStatus (). isSuccess ()) pour (prédiction AutocompletePrediction: buffer) // Ajouter en tant que nouvel élément pour éviter IllegalArgumentsException lors de la libération du tampon, ajoutez (new AutoCompletePlace (prediction.getPlaceId (), prediction.getDescription ( )));  // Empêchez la fuite de mémoire en libérant le tampon buffer.release (); , 60, TimeUnit.SECONDS); 

Le contenu de AutoCompleteAdapter est affiché en utilisant un android.R.layout.simple_list_item_1 disposition et motif standard ViewHolder dans getView.

@Override public View getView (position int, View convertView, parent ViewGroup) ViewHolder holder; if (convertView == null) holder = new ViewHolder (); convertView = LayoutInflater.from (getContext ()) .inflate (android.R.layout.simple_list_item_1, parent, false); titulaire.text = (TextView) convertView.findViewById (android.R.id.text1); convertView.setTag (titulaire);  else holder = (ViewHolder) convertView.getTag ();  holder.text.setText (getItem (position) .getDescription ()); renvoyer convertView; 

Lorsqu'un élément est cliqué dans cette liste, l'ID de l'élément sélectionné Endroit est passé au onItemClickedListener et recherché pour afficher.

5. Rechercher un lieu par ID

La dernière partie de ce tutoriel couvre la recherche d’un Endroit objet basé sur son identifiant. Cela fonctionne de manière similaire aux autres appels d’API en créant un En attente d'intention et interagir avec un tampon renvoyé pour récupérer le lieu. Comme les autres objets tampons avec lesquels vous avez travaillé, le  PlaceBuffer doit appeler Libération éviter toute fuite de mémoire.

void privé findPlaceById (id de chaîne) if (TextUtils.isEmpty (id) || mGoogleApiClient == null ||! mGoogleApiClient.isConnected ()) return; Places.GeoDataApi.getPlaceById (mGoogleApiClient, id) .setResultCallback (nouveau ResultCallback() @Override public void onResult (PlaceBuffer places) if (places.getStatus (). IsSuccess ()) Place place = places.get (0); displayPlace (lieu); mPredictTextView.setText (""); mAdapter.clear ();  // Libérez le PlaceBuffer pour éviter une fuite de mémoire places.release (); ); 

Conclusion

L'API Lieux est un outil puissant pour que vos applications connaissent l'emplacement de l'utilisateur et lui fournissent des informations contextuelles. Dans ce didacticiel, vous avez appris à utiliser le composant Place Picker, à deviner l'emplacement de l'utilisateur, à lui présenter des résultats prédictifs lors de la recherche et à rechercher un emplacement en fonction d'un identifiant donné. Outre les rubriques abordées ici, il est également possible de soumettre de nouveaux espaces à Google afin de développer les informations auxquelles l'API a accès..