martes, 1 de mayo de 2012

Realidad Aumentada en Android. Sensor de Orientación

El sensor de orientación ofrece la posibilidad de acceder a orientación del móvil en los tres ejes espaciales. Así, en el momento en el que se detecta un cambio en la orientación del dispositivo, el listener del sensor ofrece un evento SensorEvent que da acceso a un array de tres elementos:
  • Heading: la orientación en grados desde el eje X, o norte.
  • Roll: la orientación en grados respecto al eje Z.
  • Pitch: la orientación en grados respescto al eje Y.

Mediante una llamada al método getSystemService del contexto de la actividad se recupera un manejador a los sensores que servirá para acceder al sensor de orientación.
 

...

SensorManager sensorMan = (SensorManager)ctx.getSystemService(Context.SENSOR_SERVICE);

...


Posteriormenete, se recupera el sensor de orientación, indicando el tipo de sensor que se quiere recuperar SensorManager.SENSOR_ORIENTATION, el retardo con el que se recuperaran los cambios en la orientación, y el listener que implementa la acción en caso de que se detecte un cambio en la orientación.
 

...

sensorMan.registerListener( listener,
       sensorMan.getDefaultSensor(SensorManager.SENSOR_ORIENTATION),
       SensorManager.SENSOR_DELAY_NORMAL);

...



Los retardos pueden ser de cuatro tipos, SENSOR_DELAY_FASTEST, SENSOR_DELAY_UI, SENSOR_DELAY_GAME y SENSOR_DELAY_NORMAL.
Queda definir el listener que implementa la clase SensorEventListener y que sobreescribe los métodos onSensorChanged y onAccuracyChanged:



  SensorEventListener listenerOrientacion = new SensorEventListener(){
     
     public void onAccuracyChanged(Sensor arg0, int arg1)
     {}

     public void onSensorChanged(SensorEvent evt)
     {
      if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION) { 
       direccion = evt.values[0];
      }
     }
  };



listenerOrientacion simplemente sobreescribe el método onSensorChanged para almacenar en la variable direccion la dirección sobre el eje x que tiene el dispositivo móvil en el momento de recibir el evento de cambio de dirección.
En el método se discrimina por el tipo de evento ya que existen muchos tipos de evento de sensor, y puede que en otras aplicaciones tengamos mas de un tipo de sensor actuando sobre el dispositivo. En este caso, se discrimina por tipo de evento de orientación Sensor.TYPE_ORIENTATION
La clase completa que reacciona a eventos de cambio de orientación:
package com.m607.orientation;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class Orientation { 
 
 public SensorManager sensorManager;
 public float direccion;
 
 public Orientation(Context context){
  SensorEventListener listenerOrientacion = new SensorEventListener(){
     
     public void onAccuracyChanged(Sensor arg0, int arg1)
     {}

     public void onSensorChanged(SensorEvent evt)
     {
      if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION) { 
       direccion = evt.values[0];
      }
     }
  };
  
  sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
  sensorManager.registerListener(
          listenerOrientacion, 
          sensorManager.getDefaultSensor(
             SensorManager.SENSOR_ORIENTATION), 
             SensorManager.SENSOR_DELAY_NORMAL);
 }
}

1 comentario:

  1. excelente informacion (Y), estoy trabajando con un proyecto sobre realidad aumentada, y sera indispensable conocer todo acerca de los sensores y el manejo de la librerias adecuadas!!

    ResponderEliminar