I sensori in Android

L’utilizzo dei sensori in un’applicazione consente di creare app di grande utilità e a rendere le applicazioni più interattive

Android suddivide i sensori in tre categorie:

  • Motion sensors: si tratta di sensori che misurano l’accelerazione e la rotazione applicata al dispositivo. Fanno parte di questa categoria l’accelerometro, il sensore di gravità, il giroscopio e i sensori di rotazione.
  • Environmental sensors: sono i sensori per percepire l’atmosfera come la temperatura, l’illuminazione e l’umidità. Ne fanno parte il barometro, il fotometro e il termometro.
  • Position sensors: sono i sensori che misurano la posizione del dispositivo. Tra i sensori della posizione troviamo i sensori per l’orientamento e il magnometro.

    SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    List deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

In alternativa, è possibile utilizzare il metodo getSensorList() per ottenere la lista di tutti i sensori sul dispositivo tramite la costante TYPE_ALL. E’ inoltre possibile filtrare i sensori in base al loro tipo tramite le costanti TYPE_GYROSCOPE, TYPE_LINEAR_ACCELERATION e TYPE_GRAVITY.

Il metodo getDefaultSensor() viene utilizzato per verificare se un determinato sensore è disponibile. Ad esempio per verificare se il sensore del campo magnetico è supportato, scriveremo:

    SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
        // Success! There's a magnetometer.
    }
    else {
        // Failure! No magnetometer.
    }

Android consente anche di filtrare le ricerche nel PlayStore, specificando come obbligatori per l’uso dell’applicazione un certo numero di sensori. Se il dispositivo della ricerca effettuata. Per dichiarare come obbligatori dei sensori occorre inserire i tag <uses-feature> nel manifesto dell’applicazione i cui possibili valori sono: accelerometer, barometer, compass (geomagnetic field), gyroscope, light e proximity.

Ad esempio per evitare l’istallazione a gli utenti che non hanno l’accelerometro scriveremo:

    <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />

In genere vengono posti a true tutti i sensori che sono fondamentali per l’utilizzo dell’applicazione, altrimenti se l’uso della stessa non è completamente compromesso è consigliato specificarli con android:required=”false”.

Altri metodi di SensorManager sono getResolution() per ottenere la risoluzione, getMinDelay() e getMaximumRange() rispettivamente per il minimo e il massimo range tra ogni rilevazione (se il valore ritorna zero significa che il sensore non è di streaming ed invia i dati sono quando c’è un cambiamento nei parametri che sta monitorando).

Monitorare gli eventi dei sensori

Monitorare i dati rilevati dai sensori equivale a monitorare ogni cambiamento percepito dal sensore. Quando viene innescato un EventSensor vengono fornite le seguenti informazioni:

  • Il nome del sensore che ha scatenato l’evento;
  • Il timestamp dell’evento;
  • L’accuratezza dell’evento;
  • I dati (grezzi) del sensore che ha attivato l’evento.

Per monitorare i dati grezzi dei sensori bisogna implementare due metodi dell’interfaccia SensorEventListener:

  • onAccuracyChanged(): viene chiamato quando cambia la precisione dei dati del sensori e fornisce un riferimento all’oggetto del sensore che l’ha cambiato e la nuova precisione del sensore. La precisione può assumere quattro valori: SENSOR_STATUS_ACCURACY_LOW, SENSOR_STATUS_ACCURACY_MEDIUM, SENSOR_STATUS_ACCURACY_HIGH, o SENSOR_STATUS_UNRELIABLE.
  • onSensorChanged(): viene invocato quando viene rilevato un nuovo valore e viene fornito un SensorEvent con i nuovi dati del sensore come la sua precisione e il timestamp.

L’utilizzo dei sensori comporta un enorme dispendio delle risorse del dispositivo, per questo motivo è consigliato di non cancellare i listener quando l’applicazione va in background. Ad esempio:

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

Infine, ecco un esempio su come utilizzare il metodo onSensorChanged() con il sensore della luminosità:

    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) {
            // Do something here if sensor accuracy changes.
        }

        @Override
        public final void onSensorChanged(SensorEvent event) {
            // The light sensor returns a single value.
            // Many sensors return 3 values, one for each axis.
            float lux = event.values[0];
            // Do something with this sensor value.
        }

        @Override
        protected void onResume() {
            super.onResume();
            mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
        }

        @Override
        protected void onPause() {
            super.onPause();
            mSensorManager.unregisterListener(this);
        }
    }

Indice:

  1. I sensori in Android
  2. I sensori di movimento in Android
  3. I sensori ambientali in Android
  4. I sensori di posizione in Android

Per approfondire Android ecco la guida completa completa: Guida Android.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *