IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

Android soporta 3 grans families de sensors:

Es poden utilitzar els sensors d'un dispositiu Android amb Android sensor framework que proporciona classes i interficies Java per a dur a terme una varietat de tasques amb els sensors com:

  • Determinar quins sensors estan disponibles a un dispositiu:
  • Determinar les capacitats específiques d'un sensor concret.
  • Adquirir dades raw (crudes, tal qual sense processar) del sensor.
  • Registrar esdeveniments associats a sensors


Llista de sensors suportat a Android

Consulteu la table 1 de la pàgina:

http://developer.android.com/intl/es/guide/topics/sensors/sensors_overview.html

Aplicacions

Google/Android samples a Github

També disponibles a Android Studio a la secció import samples:

https://github.com/googlesamples/android-BatchStepSensor/
https://github.com/googlesamples/android-Geofencing/

Qüestions comunes a tots els sensors

Sensor Framework

El Android Sensor Framework es part del paquet android.hardware i inclou les següents classes i interfícies:

  • SensorManager: You can use this class to create an instance of the sensor service. This class provides various methods for accessing and listing sensors, registering and unregistering sensor event listeners, and acquiring orientation information. This class also provides several sensor constants that are used to report sensor accuracy, set data acquisition rates, and calibrate sensors.
  • Sensor: You can use this class to create an instance of a specific sensor. This class provides various methods that let you determine a sensor's capabilities.
  • SensorEvent: The system uses this class to create a sensor event object, which provides information about a sensor event. A sensor event object includes the following information: the raw sensor data, the type of sensor that generated the event, the accuracy of the data, and the timestamp for the event.
  • SensorEventListener: You can use this interface to create two callback methods that receive notifications (sensor events) when sensor values change or when sensor accuracy changes.

SensorManager

Obtenir objecte SensorManager

private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

Comprovar la disponibilitat d'un sensor

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

La llista completa de Sensor.SENSORTYPES la podeu trobar a la table 2 de:

http://developer.android.com/intl/es/guide/topics/sensors/sensors_overview.html

Comprovant capacitats específiques d'un sensor

http://developer.android.com/intl/es/guide/topics/sensors/sensors_overview.html

Monitoritzant un sensor

Hi ha dos esdeveniments a monitortizar:

  • A sensor's accuracy changes: onAccuracyChanged()ATUS_ACCURACY_MEDIUM, SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE.
  • Un nou valor reportat pel sensor: onSensorChanged()

Exemple:

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);
  }
}

Motion sensors

Android proporciona diferents sensors que es poden utilitzar per monitoritzar el moviment del dispositiu. Tenim diferents tipus de dispositius:

Basats en hardware

  • Accelerometer: disponible a la gran majoria de dispositius Android moderns. Calcula la força g o acceleració en els 3 eixos
  • Gyroscope: no tant habitual
  • Compas: A compass makes use of the Earth’s magnetic field to determine absolute orientation in the NESW plane.

Sovint són útils els 3 sensors per detecció de moviment global perquè tenen cadascú té les seves peculiaritats:

  • Els compasses tenen un accuracy limitada per detectar moviments ràpids però són molt precisos amb temps suficient. En canvi el gyros i els accelerometers reaccionen molt ràpidament als canvis ràpids. Els gyros només reaccionen als canvis i per tant requereixen una orientació coneguda inicial. Sovint es necessiten els 3 sensors per obtenir uns resultats acurats per a detectar moviments.

També tenim els sensors que poden ser basats en hardware o software:

Els sensors de moviment poden ser útils per detectar certs moviments com:

Acceleròmetre

Android accelerometer normalment s'utilitza per detectar els moviments d'inclinació aka Tilt i shake.

Per entendre com funciona vegeu Accelerometer hi ha un vídeo interessant. També va molt bé la app:

https://play.google.com/store/apps/details?id=com.wered.sensorsmultitool

Per veure cada eix x,y,z a que correspone a la realitat al mòbil (si el mòbil detecta la gravetat veureu que hi ha una acceleració fixa - la gravetat - encara que no mogueu el mòbil i depen de la posició del mòbils sabreu que representa la x, la y i la z)

Javascript

Detectar un shake

http://jasonmcreynolds.com/?p=388


Tilt

S'utilitza molt per a jocs basats en la inclinació o Tilt. Podem trobar múltiples exemples a la xarxa.

Exemples:

Environmental sensors

Per al Samsung Galaxy s4 hi ha una app molt interessant que mostra els 4 sensors:

https://play.google.com/store/apps/details?id=pl.komur.android.galaxys4sensors&hl=es

I hi ha una infografia dels 9 sensors a:

los-9-sensores-del-galaxy-s.jpg

Exercicis

Accelerometer Hello World

Crear una app "Hola mon" que mostri els valors de l'accelerometre amb un activitat simple amb tres TextViews. Podeu buscar múltiples exemples a Internet i vídeos com?

https://www.youtube.com/watch?v=MwH0z1HIxog

Vegeu també

Enllaços externs