Quelques étapes permettent de récupérer les données d’un capteur ou de plusieurs capteurs.
1. Etape 1 : Instancier un objet de la classe SensorManager à l’aide de getSystemService(Service.SENSOR_SERVICE) préférence dans la méthode onCreate de votre activité ;
2. Instancier un objet de la classe Sensor à l’aide de la méthode getDefaultSensor() ou getSensorList() de l’objet SensorManager instancié
3. Enregistrer l’objet Sensor pour écouter les évènements des capteurs à l’aide d’un object SensorEvenListner. Cette étape peut se faire en faisant que votre activité implémente l’interface SensorEventListener ou bien en créant une classe interne.
4. Surcharger et implémenter les méthodes onSensorChanged et onAccuracyChanged
L’exemple du code suivant permet de lister l’ensemble des capteurs sur l’appareil mobile.
package sn.ugb.mySensorApplication;
public class MainActivity extends AppCompatActivity {
SensorManager monSensormanager = null;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Etape 1 Création de l’instance de SensorManager
monSensormanager = (SensorManager) getSystemService(SENSOR_
SERVICE);
// Etape 2 recupération de la liste des capteurs
List<Sensor> listeCapteurs = monSensormanager.getSensorList(Sensor.
TYPE_ALL);
List< String> sensorData = new ArrayList<String>();
for (Sensor s: listeCapteurs) {
sensorData.add(s.getName()+ “ <br/>\n” + “ “ + s.getVendor());
}
ListView listviewCapteurs = (ListView) findViewById(R.
id.listView);
ArrayAdapter adp = new ArrayAdapter<String>(this, R.layout.
activity_main,sensorData);
listviewCapteurs.setAdapter(adp);
}
};
Ce code qui permet de lister l’ensemble des capteurs sur l’appareil mobile illustre une première utilisation des classes Sensor Manager et Sensor.
L’instanciation de l’objet Sensor Manager se fait comme suit.
SensorManager sMgr;
sMgr = (SensorManager)this.getSystemService(SENSOR_SERVICE);
Sensor light;
light = sMgr.getDefaultSensor(Sensor.TYPE_LIGHT);
sMgr.registerListener(this, light,SensorManager.
SENSOR_DELAY_NORMAL);
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
public void onSensorChanged(SensorEvent event) { }
Il est possible de découvrir l’ensemble des capteurs qui sont sur l’appareil en utilisant la methonde getSensorList de SensorManager à la place de getDefaultSensor.
public List<Sensor>getSensorList(int type)
publicclass SensorActivity extends Activity, implements SensorEventListener {
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.
TYPE_ACCELEROMETER);
}
protectedvoid onResume() { super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protectedvoid onPause() { super.onPause();
mSensorManager.unregisterListener(this);
}
publicvoid onAccuracyChanged(Sensor sensor, int accuracy) { }
publicvoid onSensorChanged(SensorEvent event) { }
}
Conclusion
Dans cette activité nous avons traité la gestion des capteurs sous Android. Avec cette activité vous êtes en mesure de récuperer les données des capteurs et intégrer des fonctionnalités qui en dépendent pour améliorer l’expérience utilisateur.
Evaluation
Questions :
1. Quel est le rôle des capteurs dans un appareil mobile ?
2. Quelles sont les différentes catégories de capteurs supportés par Android ? 3. Donnez quelques exemples de capteurs ainsi que leur utilisation courante dans
les applications mobiles.
4. Quelles sont les classes et interfaces de l’API Sensor d’Android 5. Quel est le rôle de la classe SensorManager ?
6. Quel est le rôle de la classe Sensor et ses méthodes les plus importantes ? 7. Quelles sont les méthodes qu’il faut implémenter de l’interface
SensorEventListener ?
Exercice 1 : Préparer un émulateur avec des capteurs
1. Lancez le gestionnaire d’émulateur Android en allant sur le menu Android Studio : Tools →Android → AVD Manager
Figure 11 Lancement de AVD
2. Dans la fenêtre qui s’affiche cliquez sur le bouton Create Virtual Device
Figure 12 Création d’un nouvel appareil virtuel
3. Choisir Nexus 5 puis « Clone Device »
Figure 13 Choix du modèle d’appareil de base
4. Renommez le disque en Nexus 5 UVA, et cochez tous les capteurs
Figure 14 Selection des capteurs disponibles
5. Le nouvel équipement devrait s’afficher dans la liste des équipements. Cliquez sur Next pour avancer.
Figure 15 Vérification de la disponibilité du nouvel appareil 6. Choisissez l’ABI Android qu’il vous faut. Si votre processeur support la
virtualisation utilisez le x86 ou x86_64 ; Sélectionnez armeabi-v7a si vous avez des doutes
Figure 16 Choix de la version de l’image à installer sur l’appareil
7. Réduisez la taille de l’écran pour éviter qu’elle ne dépasse pas puis finish
Figure 17 Configuration de l’appareil mobile 8. Patientez qu’il termine
Figure 18 Création de la machine virtuelle Android
9. Lancez l’émulateur
Figure 19 La nouvelle machine créer sur la liste de Android Device Manager
Exercice 2 :
Manipuler les valeurs de capteurs de l’émulateur grace à Telnet
Dans cette activité nous allons utiliser telnet pour voir les capteurs sur notre émulateur ainsi que
1. Identifiez le numéro de port sur l’émulateur. Sur cette capture c’est le 5554
Figure 20 Numéro de port de l’appareil
2. Lancez la ligne de commande puis tapez la commande : telnet localhost 5554
Figure 21 Connexion telnet sur un appareil virtuel
3. Pour afficher la liste des commandes il suffit de taper « help »
Figure 22 Liste des menus de la connexion en ligne de commande sur un appareil virtuel
4. Celui qui nous intéresse est la commande sensor. Affichez son aide avec la commande sensor ?
5. Pour afficher la liste des capteurs présents sur l’émulateur, tapez la commande sensor status
Figure 24 Liste des capteurs disponibles ainsi que leur etat
6. Les commandes get et set permettent de récupérer la valeur d’un capteur ou bien de le modifier. La syntaxe est la suivante :
sensor get nomcapeteur
sensor set nomcapteur v_0 :v_1 :v3
Affichez la valeur du capteur de temperature et celui de l’axelerometre sensor get acceleration
sensor get temperature
Modifiez la valeur de la température sensor set temperature 25:0:0 sensor get temperature
Exercice 3 : Application Station météo
Ecrire une application Android Staion météo qui permet d’afficher, l’heure actuelle et la température ambiante avec la possibilité de changer d’unité de mesure. Inspirez vous du code suivant pour réaliser l’application.
Activity.Java
package org.uva.Horloge;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
publicclassStationMeteoextends Activity implements SensorEventListener {
private SensorManager mgr;
private Sensor temp;
private TextView text;
private StringBuilder msg = new StringBuilder(2048);
@Override
publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mgr = (SensorManager) this.
getSystemService(SENSOR_SERVICE);
temp = mgr.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
text = (TextView) findViewById(R.id.text);
}
@Override
protectedvoid onResume() {
mgr.registerListener(this, temp, SensorManager.
SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protectedvoid onPause() {
mgr.unregisterListener(this, temp);
super.onPause();
}
publicvoid onAccuracyChanged(Sensor sensor, int accuracy) { }
publicvoid onSensorChanged(SensorEvent event) { float fahrenheit = event.values[0] * 9 / 5 + 32;
msg.insert(0, “Un nouvel evenement du capteur: “ + event.
values[0] + “ Celsius (“ + fahrenheit + “ F)\n”);
text.setText(msg);
text.invalidate();
} }
main_activity.xml
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/
android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<TextView android:id=”@+id/text” android:textSize=”20sp”
android:layout_width=”fill_parent” android:layout_
height=”wrap_content” />
</LinearLayout>
Exercice 4 :
Ecrire une application qui permet de lister les capteurs de lumière et de baromètre d’un appareil mobile.
MainActivity.java
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
publicclass Test extends Activity { @Override
publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text = (TextView)findViewById(R.id.text);
SensorManager mgr = (SensorManager) this.
getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = mgr.getSensorList(Sensor.TYPE_ALL);
StringBuilder message = new StringBuilder(2048);
message.append(“Les capteurs sur cet appareil sont :\n”);
for(Sensor sensor : sensors) {
message.append(sensor.getName() + “\n”);
message.append(“ Type: “ + sensorTypes.get(sensor.
getType()) + “\n”);
message.append(“ Vendor: “ + sensor.getVendor() + “\n”);
message.append(“ Version: “ + sensor.getVersion() +
“\n”);
message.append(“ Resolution: “ + sensor.getResolution() + “\n”);
message.append(“ Max Range: “ + sensor.getMaximumRange() + “\n”);
message.append(“ Power: “ + sensor.getPower() + “ mA\n”);
}
text.setText(message);
}
private HashMap<Integer, String> sensorTypes = new HashMap<Integer, String>();
{ // Initialize the map of sensor type values and names sensorTypes.put(Sensor.TYPE_ACCELEROMETER, “TYPE_
ACCELEROMETER”); // 1
sensorTypes.put(Sensor.TYPE_GYROSCOPE, “TYPE_GYROSCOPE”); //
4
sensorTypes.put(Sensor.TYPE_LIGHT, “TYPE_LIGHT”); // 5 sensorTypes.put(Sensor.TYPE_MAGNETIC_FIELD, “TYPE_MAGNETIC_
FIELD”); // 2
sensorTypes.put(Sensor.TYPE_ORIENTATION, “TYPE_ORIENTATION”);
// 3
sensorTypes.put(Sensor.TYPE_PRESSURE, “TYPE_PRESSURE”); // 6 sensorTypes.put(Sensor.TYPE_PROXIMITY, “TYPE_PROXIMITY”); //
8
sensorTypes.put(Sensor.TYPE_TEMPERATURE, “TYPE_TEMPERATURE”);
// 7
sensorTypes.put(Sensor.TYPE_GRAVITY, “TYPE_GRAVITY”); // 9 sensorTypes.put(Sensor.TYPE_LINEAR_ACCELERATION,
“TYPE_LINEAR_ACCELERATION”); // 10
sensorTypes.put(Sensor.TYPE_ROTATION_VECTOR,
“TYPE_ROTATION_VECTOR”); // 11
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<TextView android:id=”@+id/text” android:textSize=”20sp”
android:layout_width=”fill_parent” android:layout_
height=”wrap_content” />
</LinearLayout>
Exercice 5 : Navigation entre les capteurs
Ecrire un navigateur de Capteur, qui permet de voir les capteurs qui sont sur l’appareil par catégorie. Lorsque l’utilisateur clique sur un capteur, l’application lui donne les informations sur ce dernier (type, constructeur, …)
Exercice 6 : Boussole
Ecrire une application Android boussole qui fait office de boussole.
Activité 3.5 – Services Téléphonies et SMS Introduction
Cette section a pour objectif de présenter l’API de Android pour envoyer et recevoir des SMS.
Le SDK d’Android prend en charge l’envoi des SMS / MMS de deux façons :
• Invoquer via des Intents implicites une application cliente SMS installée. Cette méthode consiste à invoquer les applications SMS pré-installés sur chaque l’appareil Android.
• Envoyer les SMS directement en utilisant l’API SmsManager.
Pour tester le code de cette section il est nécessaire d’avoir un téléphone à portée de main. L’émulateur est très limité quand il s’agit de tester des fonctionnalités avancées.