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.
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 onCreate
, onStart
, 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 ();
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);
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 () PendingResultresultat = 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 (); );
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 ListfilterTypes = 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.
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 (); );
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..