• Aucun résultat trouvé

Utilisation de l’API de programmation des capteurs

Dans le document Applications Mobiles (Page 174-191)

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.

Dans le document Applications Mobiles (Page 174-191)

Documents relatifs