Accès aux services de localisation
Fournisseurs de localisation
ils savent où vous vous cachez Les terminaux Android peuvent utiliser plusieurs moyens pour déterminer votre emplacement géographique. Certains ont une meilleure précision que d’autres ; certains sont gratuits, tandis que d’autres sont payants ; certains peuvent vous donner des informations supplémentaires, comme votre altitude par rapport au niveau de la mer ou votre vitesse courante. Android a donc abstrait tout cela en un ensemble d’objets LocationProvider. Votre environnement utilisera zéro ou plusieurs instances de LocationProvider, une par service de localisation disponible sur le terminal. Ces fournisseurs ne connaissent pas seulement votre emplacement mais possèdent également leurs propres caractéristiques – précision, prix, etc. Vous aurez donc besoin d’un LocationManager contenant l’ensemble des LocationProvider pour savoir quel est le LocationProvider qui convient à votre cas particulier. Votre application devra également disposer de la permission ACCESS_LOCATION ; sinon les différentes API de localisation échoueront à cause d’une violation de sécurité. Selon les fournisseurs de localisation que vous voulez utiliser, vous pourrez également avoir besoin d’autres permissions, comme ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION.
Se trouver soi-même
L’opération la plus évidente d’un fournisseur de localisation consiste à trouver votre emplacement actuel. Pour ce faire, vous avez besoin d’un LocationManager, que vous obtiendrez par un appel à getSystemService(LOCATION_SERVICE) à partir de votre activité ou service, en transtypant le résultat pour obtenir un LocationManager. L’étape suivante consiste à obtenir le nom du LocationProvider que vous voulez utiliser. Pour ce faire, deux possibilités s’offrent à vous : ● demander à l’utilisateur de choisir un fournisseur ; ● trouver le fournisseur qui convient le mieux en fonction d’un ensemble de critères. Si vous choisissez la première approche, un appel à la méthode getProviders() du LocationManager vous donnera une liste de fournisseurs que vous pouvez présenter à l’utilisateur pour qu’il fasse son choix. Vous pouvez également créer et initialiser un objet Criteria, en précisant ce que vous attendez d’un LocationProvider. Par exemple : ● setAltitudeRequired() pour indiquer si vous avez besoin ou non de connaître votre altitude ; ● setAccuracy() pour fixer un niveau de précision minimal de la position, en mètres ; ● setCostAllowed() pour indiquer si le fournisseur doit être gratuit ou non (c’est-à-dire s’il peut impliquer un paiement de la part de l’utilisateur du terminal). Lorsque l’objet Criteria a été rempli, appelez la méthode getBestProvider() de votre LocationManager et Android passera les critères en revue pour vous donner la meilleure réponse. Tous ces critères peuvent ne pas être vérifiés – à part celui concernant le prix, ils peuvent tous être ignorés si rien ne correspond. Pour effectuer des tests, vous pouvez également indiquer directement dans votre code le nom d’un LocationProvider (gps, par exemple). Lorsque vous connaissez le nom du LocationProvider, vous pouvez appeler getLastKnownPosition() pour trouver votre dernière position. Notez, cependant, que cette « dernière position » peut être obsolète (si, par exemple, le téléphone était éteint) ou valoir null si aucune position n’a encore été enregistrée pour ce fournisseur. En revanche, getLastKnownPosition() est gratuite et ne consomme pas de ressource car le fournisseur n’a pas besoin d’être activé pour connaître cette valeur. Ces méthodes renvoient un objet Location qui vous indiquera la latitude et la longitude du terminal en degrés – des valeurs double de Java. Si le fournisseur donne d’autres informations, vous pouvez les récupérer à l’aide des méthodes suivantes : ● hasAltitude() indique s’il y a une valeur pour l’altitude et getAltitude() renvoie l’altitude en mètres. ● hasBearing() indique s’il y a une information d’orientation (une valeur de compas) et getBearing() renvoie cette valeur en degrés par rapport au vrai nord. ● hasSpeed() indique si la vitesse est connue et getSpeed() la renvoie en mètres par seconde. Ceci dit, une approche plus fréquente pour obtenir l’objet Location à partir d’un LocationProvider consiste à s’enregistrer pour les modifications de la position du terminal.
Se déplacer
Tous les fournisseurs de localisation ne répondent pas immédiatement. GPS, par exemple, nécessite l’activation d’un signal et la réception des satellites (c’est ce que l’on appelle un « fix GPS ») avant de pouvoir connaître sa position. C’est la raison pour laquelle Android ne fournit pas de méthode getMeMyCurrentLocationNow(). Ceci combiné avec le fait que les utilisateurs puissent vouloir que leurs mouvements soient pris en compte dans l’application, vous comprendrez pourquoi il est préférable d’enregistrer les modifications de la position et les utiliser pour connaître la position courante. Les applications Weather et WeatherPlus montrent comment enregistrer ces mises à jour – en appelant la méthode requestLocationUpdates() de l’objet LocationManager. Cette méthode prend quatre paramètres : 1. Le nom du fournisseur de localisation que vous souhaitez utiliser. 2. Le temps, en millisecondes, qui doit s’écouler avant que l’on puisse obtenir une mise à jour de la position. 3. Le déplacement minimal du terminal en mètres pour que l’on puisse obtenir une mise à jour de la position. 4. Un LocationListener qui sera prévenu des événements liés à la localisation, comme le montre le code suivant : LocationListener onLocationChange=new LocationListener() { public void onLocationChanged(Location location) { updateForecast(location); } public void onProviderDisabled(String provider) { // Exigée par l’interface, mais inutilisée } public void onProviderEnabled(String provider) { // Exigée par l’interface, mais inutilisée } public void onStatusChanged(String provider, int status, Bundle extras) { // Exigée par l’interface, mais inutilisée } }; Ici, nous appelons simplement updateForecast() en lui passant l’objet Location fourni à l’appel de la méthode de rappel onLocationChanged(). Comme on l’a vu au Chapitre 30, l’implémentation d’updateForecast() construit une page web contenant les prévisions météorologiques pour l’emplacement courant et envoie un message de diffusion afin que l’activité sache qu’une mise à jour est disponible. Lorsque l’on n’a plus besoin des mises à jour, on appelle removeUpdates() avec le LocationListener que l’on avait enregistré.