android e sensori
TRANSCRIPT
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; } }