Android e sensori
Il mondo percepito dallo smartphone
Quali sono?
• Accelerometro;
• Temperatura ambiente;
• Gravità;
• Giroscopio;
• Luce;
• Accelerazione lineare;
• Campo magnetico;
• Orientamento;
• Pressione;
• Prossimità
• Umidità relativa;
• Vettore di rotazione;
• Temperatura.
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.
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);
SensorManager
• Classe che permette di ottenere istanze di
sensori, registrare/stoppare un callback e
altro.
SensorManager sManager =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
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.
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.
Acquisizione dati
Si acquisiscono attraverso due metodi
dell'interface SensorEventListener:
1. onAccuracyChanged(Sensor sensor, in
accuracy);
2. onSensorChanged(SensorEvent event);
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
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
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.
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);
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);
}
}
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
}
}
@Override
public final void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
break;
case Sensor.TYPE_PROXIMITY:
break;
}
}

Android e sensori

  • 1.
    Android e sensori Ilmondo percepito dallo smartphone
  • 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 dimovimento: – 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 • Aseconda 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 chepermette 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 dellaclasse 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 acquisisconoattraverso due metodi dell'interface SensorEventListener: 1. onAccuracyChanged(Sensor sensor, in accuracy); 2. onSensorChanged(SensorEvent event);
  • 9.
    onAccuracyChanged Monitora cambiamenti diprecisione 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 quandoil 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]: arrayfloat 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 arrestodel 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 SensorActivityextends 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 calibrazionedove: • 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 voidonSensorChanged(SensorEvent event) { switch(event.sensor.getType()){ case Sensor.TYPE_ACCELEROMETER: break; case Sensor.TYPE_PROXIMITY: break; } }