2. Quali sono?
• Accelerometro;
• Temperatura ambiente;
• Gravità;
• Giroscopio;
• Luce;
• Accelerazione lineare;
• Campo magnetico;
• Orientamento;
• Pressione;
• Prossimità
• Umidità relativa;
• Vettore di rotazione;
• Temperatura.
3. Classificazione
• Sensori di movimento:
– accelerometro, gravità, giroscopio, accelerazione
lineare.
• Sensori ambientali:
– temperatura ambiente, luce, pressione, umidità
relativa, temperatura.
• Sensori di posizione:
– campo magnetico, orientamento, prossimità,
vettore di rotazione.
4. Alcune considerazioni
• A seconda del dispositivo possono esserci altri
sensori (esempio, Galaxy note 4 e il sensore
raggi UV);
• Recenti API hanno introdotto sensori legati al
benessere (battito cardiaco) o al movimento
dell'utente (step);
5. SensorManager
• Classe che permette di ottenere istanze di
sensori, registrare/stoppare un callback e
altro.
SensorManager sManager =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
6. Ottenere i sensori
• Ottenere tutti i sensori disponibili:
– List<Sensor> deviceSensors = sManager.getSensorList(Sensor.TYPE_ALL);
• Ottenere un sensore specifico:
– Sensor sensor = sManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
– Se ritorna null il dispositivo non supporta il sensore.
7. Metodi utili della classe Sensor
• getResolution(): risoluzione del sensore, ritorna un float;
• getMaximumRange(): messimo range del sensore, ritorna un float;
• getPower(): energia usata dal sensore in mA, ritorna un float;
• getVendor(): ritorna una stringa che identifica il produttore del sensore;
• getVersion(): ritorna un intero che rappresenta la versione del sensore.
• getMinDelay(): ritorna un intero che rappresenta il tempo minimo tra una
registrazione e l'altra, o 0 se il sensore registra un valore solo quanto
questo cambia.
8. Acquisizione dati
Si acquisiscono attraverso due metodi
dell'interface SensorEventListener:
1. onAccuracyChanged(Sensor sensor, in
accuracy);
2. onSensorChanged(SensorEvent event);
9. onAccuracyChanged
Monitora cambiamenti di precisione del sensore.
1. Sensor sensor: sensore su cui si registra un
cambiamento di precisione.
2. Int accuracy: può assumere 4 valori, espressi dalle
costanti:
1. SENSOR_STATUS_ACCURACY_LOW
2. SENSOR_STATUS_ACCURACY_MEDIUM
3. SENSOR_STATUS_ACCURACY_HIGH
4. SENSOR_STATUS_UNRELIABLE
10. onSensorChanged
Viene chiamato quando il sensore registra un
nuovo valore.
1. SensorEvent: un oggetto contente tutte le
informazioni necessarie:
1. Il sensore che ha registrato il valore
2. La precisione del valore
3. Timestamp
4. Il valore
11. SensorEvent
• sensorEvent.values[n]: array float contenente
i valori registrati dal sensore
• sensorEvent.sensor: ritorna l'oggetto Sensor
che ha fatto registrare la variazione.
• sensorEvent.sensor.getType(): ritorna un
intero riferito al tipo di sensore.
12. Avvio e arresto del monitoraggio
Si effettuano attraverso metodi di SensorManager:
• registerListener(Context context, Sensor
sensor, int maxReportLatencyUs);
• unregisterListener(SensorEventListener listener,
Sensor sensor);
• unregisterListener(SensorEventListener listener);
13. public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mLight;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
@Override
public final void onSensorChanged(SensorEvent event) {
float lux = event.values[0];
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
14. Dopo una calibrazione dove:
• minValue = valore minimo della somma
• maxValue = valore massimo della somma
Registro il sensore di accelerazione lineare e:
@Override
public final void onSensorChanged(SensorEvent event) {
accX=Math.abs(event.values[0]);
accY=Math.abs(event.values[1]);
accZ=Math.abs(event.values[2]);
double sum = accX+accY+accZ;
if(sum>=minValue && sum<=maxValue){
//Dispositivo fermo
}
}
15. @Override
public final void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
break;
case Sensor.TYPE_PROXIMITY:
break;
}
}