Types de capteurs
- Obtention de SensorManager : Context.getSystemService(Context.SENSOR_SERVICE)
- Liste des capteurs : SensorManager.getSensorList(int typeOfSensor)
-
Types de senseurs actuellement supportés :
- Accéléromètre, gyroscope
- Thermomètre, hygromètre, baromètre
- Magnétomètre
- Senseur de proximité
- Luxmètre
-
Certains capteurs sont accessibles de plusieurs manières (données brutes ou données analysées) :
- Accéléromètre : Sensor.TYPE_ACCELEROMETER, Sensor.TYPE_GRAVITY, Sensor.TYPE_LINEAR_ACCELERATION
Comment utiliser des capteurs ?
-
On créé un SensorEventListener avec deux méthodes à implanter :
- void onAccuracyChanged(Sensor s, int accuracy) : est appelée lorsque la précision change (SENSOR_STATUS_ACCURACY_{UNRELIABLE, LOW, MEDIUM, HIGH})
- void onSensorChanged(SensorEvent event) : event contient les champs accuracy, sensor, timestamp et values (tableau de float décrivant les données)
- On enregistre ce listener (typiquement dans Activity.onResume()) : sensorManager.registerListener(listener, sensor, delay) ;
- L'échantillonnage des valeurs est limité à 200 Hz sauf si on utilise la permission HIGH_SAMPLING_RATE_SENSORS
- Lorsque l'on ne souhaite plus recevoir des événements des senseurs (typiquement dans Activity.onPause()), on enlève le listener :
- sensorManager.unregisterListener(listener, sensor) ;
Exemple : liste des valeurs des capteurs
Activité affichant les valeurs de tous les capteurs de l'appareil
// Code sample from Coursand [http://igm.univ-mlv.fr/~chilowi/], under the Apache 2.0 License package fr.upem.coursand.sensors; 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.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** An activity displaying the values of all the sensors of the Android device */ public class SensorDisplayer extends Activity { private SensorManager sensorManager; private List<Sensor> sensors; private final List<float[]> latestSensorEvents = new ArrayList<>(); private SensorEventListener sensorListener; private ListView sensorListView; private ArrayAdapter<float[]> arrayAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for (int i = 0; i < sensors.size(); i++) latestSensorEvents.add(null); // We create the listener for the sensor events this.sensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { updateSensorValue(event); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} }; // We create a list view displaying all the sensor data // Data for a sensor is put as a float array into an array list sensorListView = new ListView(this); arrayAdapter = new ArrayAdapter<float[]>(this, android.R.layout.simple_list_item_1, latestSensorEvents) { @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv = (TextView)convertView; if (tv == null) tv = new TextView(SensorDisplayer.this); float[] values = getItem(position); String message = sensors.get(position).getName() + ":\n" + ((values == null)?"no data available":Arrays.toString(values)); tv.setText(message); return tv; } }; sensorListView.setAdapter(arrayAdapter); setContentView(sensorListView); } public void updateSensorValue(SensorEvent sensorEvent) { // update the sensor values latestSensorEvents.set(sensors.indexOf(sensorEvent.sensor), Arrays.copyOf(sensorEvent.values, sensorEvent.values.length)); arrayAdapter.notifyDataSetChanged(); } @Override public void onResume() { super.onResume(); // We register the listener for all the sensors for (Sensor s: sensors) sensorManager.registerListener(sensorListener, s, SensorManager.SENSOR_DELAY_UI); } @Override public void onPause() { super.onPause(); // We unregister the listener for (Sensor s: sensors) sensorManager.unregisterListener(sensorListener, s); } }
Capteurs externes
- L'API Android ne supporte pas nativement des capteurs externes
- Le support est fourni par des applications tierces
-
Les capteurs externes peuvent communiquer par :
- la prise jack du haut-parleur/microphone ; cela permet d'alimenter simultanément les capteurs peu énergivores (ex : capteur de radioactivité, mesureur de champ électromagnétique...)
- USB (avec connecteur μ-USB ou USB-C) ; le capteur peut aussi être alimenté par l'USB
- Bluetooth classique et Bluetooth Low Energy ; le capteur doit disposer d'une alimentation externe (ex : cardiofréquencemètre sous Bluetooth LTE, balance, montre connectée...)
- WiFi direct (plutôt énergivore)