Capteurs et géolocalisation
Introduction
Les capteurs sont certainement l’une des fonctionnalités les plus novatrices des terminaux portables que sont les smartphones et tablettes. La plupart des appareils Android intègrent en effet plusieurs capteurs, apportant un lot significatif d’amélioration pour l’expérience utilisateur : géolocalisation, réaction à l’inclinaison, détection de la quantité de lumière environnante, mesure de la température ambiante ou encore mesure du nombre de pas que l’utilisateur a fait !
Là encore, la difficulté pour le développeur, si difficulté il y a, se trouve dans la multitude de configurations matérielles différentes : tous les terminaux Android ne proposent pas les mêmes capteurs.
Dans ce chapitre, nous allons voir comment utiliser ces capteurs puis, nous ferons une étude plus approfondie des capteurs de position et de la géolocalisation. Nous verrons, enfin, comment intégrer un module de cartographie open source, base sur Open Street Map.
Les capteurs
L’utilisation des capteurs met principalement en jeu les classes suivantes du package android.hardware :
-
La classe SensorManager : cette classe permet de récupérer la liste des capteurs disponibles sur un terminal, et est également en charge de l’instanciation d’un objet de type Sensor (capteur, en anglais) et de son rattachement à un gestionnaire d’événement.
-
La classe Sensor, qui représente un capteur. Elle permet d’obtenir les valeurs mesurées par le capteur ainsi que ses caractéristiques (nom, précision, fréquence de mesure, consommation électrique, etc.).
-
Les classes SensorEventListener et SensorEvent, qui permettent de gérer les événements levés par chaque capteur.
1. Détecter un capteur
Tous les capteurs supportés par la plateforme Android ne sont pas nécessairement intégrés dans les terminaux Android. Il faut donc, avant d’utiliser un capteur, s’assurer de sa présence sur l’appareil qui exécute l’application.
Deux stratégies distinctes sont possibles pour gérer la disponibilité d’un capteur :
-
Si le capteur est indispensable au bon fonctionnement de l’application, il est préférable d’indiquer au Google Play Store que l’application ne doit être présentée qu’aux terminaux disposant de ce capteur.
-
Si le capteur est un plus, non essentiel, il faut détecter à l’exécution de l’application la disponibilité du capteur.
Le premier cas est réglé, comme pour les autres restrictions matérielles, directement dans le fichier manifeste de l’application, en utilisant le paramètre <uses-feature> (se reporter au chapitre Publier une application, section Préliminaires - Filtres pour le marché, pour une description complète).
Syntaxe
<uses-feature android:name="nom_du_capteur" android:required="true" />
Exemple
<uses-feature android:name="android.hardware.sensor.light"
android:required="true"/>
Dans le second cas, la classe SensorManager permet de vérifier la présence d’un capteur selon son type, soit en listant les capteurs disponibles sur l’appareil, soit...
Localisation géographique
La localisation géographique, ou géolocalisation, permet de localiser l’appareil Android à un instant t de façon plus ou moins précise en fournissant de multiples informations et notamment ses coordonnées géographiques : la latitude et la longitude.
Toute application peut dès lors utiliser la géolocalisation pour localiser l’appareil et son utilisateur.
Afin de respecter la vie privée de l’utilisateur, il est de bon ton de le prévenir au minimum que l’application utilise ses coordonnées géographiques. Lui laisser la possibilité d’activer et de désactiver le système de géolocalisation à tout instant, par exemple via une case à cocher, est encore mieux. Par défaut, cette case devra être décochée afin que l’utilisateur et lui seul donne son accord explicite pour qu’il soit localisé.
Selon les matériels équipant l’appareil Android, le système peut s’appuyer sur un ou plusieurs dispositifs permettant de fournir les coordonnées de localisation. Ce peut être une puce GPS, ou le réseau cellulaire accouplé aux réseaux Wi-Fi environnants.
Chacun de ces dispositifs possède ses avantages et ses faiblesses. D’un côté, le système GPS permet d’obtenir des coordonnées précises en contrepartie d’une consommation de batterie importante, du besoin d’un environnement extérieur dégagé et d’un délai de localisation pouvant être plus long qu’avec les autres dispositifs.
De l’autre, le système Android utilise moins de batterie pour capter le réseau cellulaire et les réseaux Wi-Fi. Il le fait plus rapidement, même en intérieur, mais la localisation est moins précise.
Le système de géolocalisation Android permet de s’adapter automatiquement au matériel fourni par l’appareil et activé par l’utilisateur. De fait, le développeur ne doit pas préjuger du matériel dont l’application a accès sauf cas particuliers. L’application doit s’adapter automatiquement à tous les environnements matériels.
C’est pourquoi, idéalement...
Cartographie
Un autre usage courant des applications est d’afficher des cartes géographiques permettant à l’utilisateur de situer rapidement des lieux, des événements, des commerces…
Par défaut, le système Android n’inclut pas de telles possibilités. La société Google propose sa bibliothèque externe de cartographie com.google.android.maps pour ajouter de telles fonctionnalités au système de base.
Si l’intégration de cette solution de cartographie est devenue très simple (un modèle de projet Google Maps est intégré à Android Studio), elle est, par la même occasion, devenue payante ! Heureusement, d’autres solutions de cartographie sont proposées gratuitement, qui fonctionnent selon un principe similaire à Google Maps. C’est le cas, par exemple, d’Open Street Map, projet de cartographie collaboratif le plus abouti à l’heure actuelle.
La mise en œuvre d’Open Street Map dans une application Android peut se faire de deux façons : soit utiliser la version web, soit utiliser une API spécifique pour une intégration plus poussée. C’est cette méthode que nous allons présenter dans la suite de ce chapitre.
1. Mise en place
Plusieurs API permettent d’intégrer Open Street Map (souvent désigné sous l’acronyme OSM). Notre choix s’est porté sur une API open source, osmdroid, qui a pour avantage de reprendre le principe de fonctionnement de Google Maps, dans le but avoué de faciliter la migration de l’un vers l’autre. Cette API a été initiée par Nicolas Gramlich en 2008, puis reprise pour corrections par une équipe plus conséquente. Le projet est hébergé sur le site GitHub (https://github.com/osmdroid/osmdroid) et est toujours actif.
osmdroid ne demande aucune clé d’enregistrement (contrairement à Google Maps) pour fonctionner. Il suffit, pour utiliser l’API, d’ajouter une référence dans le fichier Gradle de l’application.
L’API est disponible sous le nom complet suivant : org.osmdroid:osmdroid-android ; la dernière version stable, à la date de rédaction de cet ouvrage, est la version 6.0.1....