I sensori (1)I dispositivi Android hanno dei sensori hardware inclusi. Tali sensori prendono informazioni dal mondo circostante e li traducono in dati nelle applicazioni.Tali informazioni possono essere utilizzate per diversi scopi:● sistema di controllo in un gioco● realtà aumentata● geoposizionamento e mappe● etc.
I sensori (2)I sensori che possono essere inclusi nei dispositivi Android sono i seguenti:● luce (light sensor)● prossimità (proximity sensor)● temperatura (temperature sensor)● pressione (pressure sensor)● accelerometro (accelerometer)● campo magnetico (magnetic field sensor)● orientamento (orientation sensor)● gravità (gravity sensor) ● rotazione (rotation vector sensor) (2.3)● nfc (near field communication sensor) (2.3)
Permessi e feature
Permessi e feature (1)uses-featureAndroid usa le feature per dichiarare la necessità di un elemento presente nel dispositivo. Google Play seleziona automaticamente le applicazioni installabili sul proprio dispositivo a seconda delle feature dichiarate.
<uses-feature android:name = "android.hardware.camera"[android:required = "true|false"] />
Il parametro android:required è opzionale è può essere true o false. Nel caso non sia presente o sia true l'applicazione verrà installata solo su un dispositivo che ha la camera.
Permessi e feature (2)uses-permissionPermessi richiesti all’utente in fase di installazione della app.
<uses-permission android:name = android.permission.CAMERA" />
I permessi devono essere dichiarati altrimenti l’app non funziona.Esempi di permessi:
WRITE_EXTERNAL_STORAGE (scrittura memory card)READ_CONTACTS (accesso ai contatti)ACCESS_COARSE_LOCATION (posizione approssimata: wi-fi e celle)ACCESS_FINE_LOCATION (posizione precisa: gps, wi-fi e celle)CALL_PHONE (consente le chiamate)
Sensori e featureNon tutti i sensori elencati sono sempre disponibili. Dipende dal modello del dispositivo. Nel manifest si può specificare quali sensori sono necessari nell'applicazione:
<uses-feature android:name = "android.hardware.sensor.proximity" />
In questo caso l'applicazione verrà installata solo su un dispositivo che ha il sensore di prossimità.
Utilizzo dei sensori
Utilizzare i sensori (1)Le classi che ci servono per gestire i sensori sono: Sensor e SensorManager. L'accesso ai sensori viene fatto in maniera asincrona, in base a un tempo di delay impostato.Le operazioni sono le seguenti:
1. ottenere una istanza della classe SensorManager2. accedere al sensore mediante la classe Sensor3. impostare un Listener4. accedere ai dati, gestendo gli eventi
Utilizzare i sensori (2)1. Ottenere una istanza della classe SensorManager
Il metodo getSystemService( ) della classe Context (superclasse di Activity) viene utilizzato per ottenere un accesso a un servizio di sistema (a esempio l'allarme, il volume, la gestione dell'audio e in questo caso anche i sensori).Il metodo ritorna un Object generico (da trasformare con il cast) e richiede una stringa che specifica il tipo si servizio richiesto:
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Utilizzare i sensori (3)2. Accedere al sensore mediante la classe Sensor
Definito il SensorManager lo utilizziamo per accedere al sensore specifico mediante il metodo getDefaultSensor( ):
Sensor luce = manager.getDefaultSensor(Sensor.TYPE_LIGHT );
Sensor acc = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER );
Nel primo caso accediamo al sensore di luce, nel secondo all'accelerometro.
Utilizzare i sensori (4)3. Impostare un Listener
Impostare un Listener sul SensorManager, utilizzando il metodo registerListener( ), passandogli il listener, il Sensor e il tempo di delay che vogliamo utilizzare tra una rilevazione e l'altra (SENSOR_DELAY_FASTEST, SENSOR_DELAY_GAME, SENSOR_DELAY_UI, SENSOR_DELAY_NORMAL):
manager.registerListener(luceListener, luce, SensorManager.SENSOR_DELAY_NORMAL);
manager.registerListener(accListener, acc,SensorManager.SENSOR_DELAY_NORMAL);
Utilizzare i sensori (5)4. Accedere ai dati, gestendo gli eventi
Creiamo il Listener dell'evento e gestiamo gli eventi onSensorChanged (quando i dati del sensore cambiano) e onAccuracyChanged (quando la precisione del sensore viene cambiata):
private SensorEventListener listener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) { }public void onAccuracyChanged(Sensor arg0, int arg1){ }
};
Utilizzare i sensori (6)A seconda del sensore osservato, otteniamo diversi valori.
Accelerometro - possiamo accedere ai tre valori x, y e z dell'accelerometro con il seguente codice:
public void onSensorChanged(SensorEvent event) {float x = event.values[0]; float y = event.values[1]; float z = event.values[2];
}Luce - possiamo a un valore, l'intensità di luce rilevata:
public void onSensorChanged(SensorEvent event) {float luce=event.values[0];
}
Utilizzare il GPS
Utilizzo del GPS (1)Impostiamo prima di tutto i permessi e le feature nel manifest:
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION"/>
Utilizziamo anche qui il metodo getSystemService( ) ma questa volta lo assegnamo ad un manager di tipo LocationManager:
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Utilizzo del GPS (2)Impostiamo un listener con il metodo requestLocationUpdates:
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, int millisecondi, float metri, locationListener);
Es: manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, listener)
imposta un listener sul provider gps ogni 3 secondi e ogni volta che ci si sposta di 10 metri.
// tipo provider// intervallo minimo di aggiornamento// distanza minima di aggiornamento// listener
Utilizzo del GPS (3)Dopodichè si crea il listener di classe LocationListener:LocationListener locationListener= new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {// quando il provider ha cambiato disponibilità
}public void onProviderEnabled(String provider) {
// quando si attiva un provider }public void onProviderDisabled(String provider) {
// quando si disattiva un provider }public void onLocationChanged(Location location) {
// quando la location cambia }
};
Utilizzo del GPS (4)Il metodo onLocationChanged è quello che ci interessa: ci ritorna un oggetto di classe Location con le indicazioni relativa alla posizione:
public void onLocationChanged(Location location) {double longitude = location.getLongitude();double latitude = location.getLatitude();...
}
Esercizio SensoriCreare un programma che permetta di rilevare la quantità di luce presente e utilizzi la variazione di tale dato per cambiare il colore di un componente.Rilevare anche i dati dell'accelerometro e quelli del gps.