Androideity

Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android

Detección y Manejo de Sensores

| | 9 Comentarios

Una de las características que más llamó la atención desde el primer dispositivo Android, es la implementación de diferentes tipos sensores, los cuáles no parecen tener límite en los nuevos dispositivos que salen a la luz (¿De verdad se necesita un barómetro en el móvil?) y a la par de ello su implementación a través de código se realiza de manera sencilla y rápida.
Para el manejo de los diferentes sensores disponibles es necesario hacer uso de estas clases:
- Sensor, que representa al sensor de turno que estamos por utilizar.
- SensorManager, que nos permite acceder a los sensores del dispositivo
y la Interfaz.
- SensorEventListener, que registra los cambios hechos en el sensor indicado
con eso podemos empezar a registrar los cambios hechos en los sensores, y ahora… ¡manos al codigo!

PASO I: Crear la Interfaz a Utilizar

Para poder ver los cambios registrados por los sensores de nuestro dispositivos, vamos a implementar en nuestra interfaz 2 TextView que nos permitirá mostrar el valor de los cambios ocurridos en nuestros sensores.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent">
     <TextView android:id = "@+id/etiqSensorDeMovimiento"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/etiqSensorDeMovimiento">
     </TextView>
     <TextView
     android:id = "@+id/sensorDeMovimiento"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/hello">
     </TextView>
     <TextView
     android:id = "@+id/etiqSensorDeOrientacion"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/etiqSensorDeOrientacion">
     </TextView>
     <TextView
     android:id="@+id/sensorDeOrientacion"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/hello">
     </TextView>
     </LinearLayout>

PASO II: Crear la Actividad

La actividad que vamos a crear hereda de Activity para otorgarle las características de una activdad e implementa SensorEventListener para el registro de cambios en el sensor
public class SensorActivity extends Activity implements SensorEventListener{

PASO III: Definir las variables a utilizar

En este caso he definido 5 variables del tipo Sensor los cuales utilizaré para guardar una instancia de cada sensor que pueda detectar usando un objeto de SensorManager, y 2 objetos de TextView, los cuales ya definimos en la interfaz y modificaremos a través de código.
    private SensorManager sensorManager = null;
    private Sensor sensorDeTemperatura = null;
    private Sensor sensorDeProximidad = null;
    private Sensor sensorDeLuz = null;
    private Sensor sensorAcelerometro = null;
    private Sensor sensorDeOrientacion = null;
    private TextView textViewAcelerometro = null;
    private TextView textViewOrientacion = null;

PASO IV: Detección de Sensores

Para poder obtener instancias de los sensores embebidos en el dispositivo Android, se utiliza SensorManager a través de la llamada al método getSystemService() que nos retorna un servicio a nivel de sitema dependiendo del parámetro que le pasemos, en este caso SENSOR_SERVICE, pues queremos hacer uso de los sensores.

Una vez inicializado sensorManager, podemos hacer uso de este objeto para solicitar instancias de los diferentes tipo de sensores haciendo uso del metodo getDefaultSensor() y añadiendo el tipo de sensor que queremos como parametro

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorDeProximidad = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    sensorDeTemperatura = sensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
    sensorDeLuz = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    sensorAcelerometro = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorDeOrientacion = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

PASO V: Registro del manejador de Eventos de los sensores

Existe la posibilidad de que nuestro dispositivo, no tenga todos estos sensores que pensamos, por ejemplo en el dispositivo que yo estoy utilizando no hay sensor de Temperatura, por lo que siempre es buena idea hacer un filtro que nos permita identificar con cuales si contamos y añadir el manejador de envetos de acuerdo a eso.

El siguiente código lo hace de una manera sencilla, si el sensor existe registra el manejador de eventos usando el método registerListener() del objeto sensorManager, al que se le pasa como parámetros, la clase que está implementando la interfaz SensorEventListener, el sensor que se quiera registrar y la velocidad de registro de cambios en el sensor.

if(sensorAcelerometro == null){
        Toast.makeText(getApplicationContext(), "No hay Sensor movimiento", Toast.LENGTH_SHORT).show();
}
else{
       	Toast.makeText(getApplicationContext(), "Hay Sensor de movimiento", Toast.LENGTH_SHORT).show();
       	sensorManager.registerListener(this, sensorAcelerometro, SensorManager.SENSOR_DELAY_NORMAL);
}

if(sensorDeProximidad == null){
       	Toast.makeText(getApplicationContext(), "No hay Sensor de Proximidad", Toast.LENGTH_SHORT).show();
}
else{
       	Toast.makeText(getApplicationContext(), "Hay Sensor de Proximidad", Toast.LENGTH_SHORT).show();
       	sensorManager.registerListener(this, sensorDeProximidad, SensorManager.SENSOR_DELAY_NORMAL);
}

if(sensorDeLuz == null){
      	Toast.makeText(getApplicationContext(), "No hay Sensor de Luz", Toast.LENGTH_SHORT).show();
}
else{
       	Toast.makeText(getApplicationContext(), "Hay Sensor de Luz", Toast.LENGTH_SHORT).show();
       	sensorManager.registerListener(this, sensorDeLuz, SensorManager.SENSOR_DELAY_NORMAL);
}

if(sensorDeTemperatura == null){
      	Toast.makeText(getApplicationContext(), "No hay sensor de Temperatura", Toast.LENGTH_SHORT).show();
}
else{
       	Toast.makeText(getApplicationContext(), "Hay sensor de Temperatura", Toast.LENGTH_SHORT).show();
      	sensorManager.registerListener(this, sensorDeTemperatura, SensorManager.SENSOR_DELAY_NORMAL);
}

if(sensorDeOrientacion == null){
       	Toast.makeText(getApplicationContext(), "No hay sensor de Orientacion", Toast.LENGTH_SHORT).show();
}
else{
       	Toast.makeText(getApplicationContext(), "Hay sensor de Orientacion", Toast.LENGTH_SHORT).show();
       	sensorManager.registerListener(this, sensorDeOrientacion, SensorManager.SENSOR_DELAY_NORMAL);
}

PASO VI: Registro de Variables del Interfaz

Esta parte es sencilla para quienes vienen siguiendo los tutoriales de Androideity ;) , es solo inicializar los TextView definidos en la interfaz anterior

        setContentView(R.layout.main);

        textViewAcelerometro = (TextView) findViewById(R.id.sensorDeMovimiento);
        textViewAcelerometro.setTextSize(30);

        textViewOrientacion = (TextView) findViewById(R.id.sensorDeOrientacion);
        textViewOrientacion.setTextSize(30);
}

PASO VII: Implementación de los métodos de la Interfaz

La Interfaz SensorEventListener nos pide implementar 2 métodos:

- onAccuracyChanged(Sensor sensor, int accuracy), en la cual implementaremos las acciones a realizar cuando se cambia la precision de un sensor.

- onSensorChanged(SensorEvent event), la cual nos permite implementar las acciones a realizar cuando un sensor registre un cambio.

@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}

@Override
public void onSensorChanged(SensorEvent arg0) {
	synchronized (this){
		float[] masData;
		float x;
		float y;
		float z;
		// TODO Auto-generated method stub
		switch(arg0.sensor.getType()){
			case Sensor.TYPE_PROXIMITY:
				masData = arg0.values;
				if(masData[0]==0){
					textViewAcelerometro.setTextSize(textViewAcelerometro.getTextSize()+10);
				}
				else{
					textViewAcelerometro.setTextSize(textViewAcelerometro.getTextSize()-10);
				}
				break;
                        case Sensor.TYPE_ACCELEROMETER:
                         	masData = arg0.values;
		                x = masData[0];
				y = masData[1];
                                z = masData[2];
                                textViewAcelerometro.setText("x: " + x + "\ny: "+y + "\nz: "+z);
				break;
               		case Sensor.TYPE_ORIENTATION:
				masData = arg0.values;
				x = masData[0];
				y = masData[1];
				textViewOrientacion.setText("x: " + x + "\ny: "+y);
				break;
			default:
				break;
			}
		}
	}

En este caso se ha implementado de manera que muestre en un TextView las variaciones registradas por los sensores

RECOMENDACIONES

El uso de los sensores requiere de más energía por parte de la aplicación a diferencia de las que no lo hacen, por lo que es recomendable liberar al manejador de eventos cuando se vaya a salir de la aplicación e implementarla de nuevo cuando se vaya a hacer uso de ésta nuevamente. Esto se puede hacer de la siguiente manera:

        @Override
	protected void onResume() {
		super.onResume();
		sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),SensorManager.SENSOR_DELAY_NORMAL);
	}

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

Espero les sea de utilidad este tutorial, dudas, preguntas, quejas o sugerencias, nos encontramos en los comentarios más abajo, si les gustó no se olviden de compartir =)

ENJOY!!!

Comparte este post

Acerca de: kerpie

Desarrollador freelancer Java/PHP/JS, androider, Chico Digital, Multitarea, Activado por voz, Interactivo, Fácil de Usar, Genial, Vengo en Alta Definición, Con capacidad Ilimitada en Ancho de Banda, Inalámbrico, Directo, Con el niño Interior mas Afuera que Adentro, Tan Humilde que me siento Orgulloso de eso... y soy Biodegradable!

Sígueme en Twitter

Leer todos mis artículos

También puede interesarte

Comentarios de este artículo

  • William Knowles

    Hola tengo el entorno eqclipse HELIOS y utilizo maquina virtual dalvick, me gustaria saber si en el emulador puedo implementar esta aplicación. y con que version funciona este ejemplo

  • William Knowles

    Si tubiese mi smartphone con sensor de proximidad incorporado y me paro frente a una pared ¿El sensor de proximidad detectará la distancia entre la pared y yo?, para hacer que sensor debo utilizar???

  • Italo

    segui todo los pasos y pude cargar la aplicacion sin problemas en una tablet, para probar el acelerometro pero no hace nada, aparece la pantalla en blanco, y en el main_activity del Eclipse, tampoco parecen los textos ni nada

  • Miguel

    Como puedo detectar si el dispositivo movil no tiene movimiento?

  • Enrique Gudiño

    Ahi está una captura de la app, en mi tablet sólo hay sensor de movimiento los demás no jeje (es una tablet sencillita) pero funciona bien si es muy sensible al mismo y muestra valores para X, Y y Z todo muy bien

    • Oscar Heredia

      tienes laguna recomendacion al momento de transcribir, he intentado pero me debe estar faltando alguna consideracion

      • Enrique Gudiño

        Si, un error común es en la declaración de variables/objetos cuando declaras lo escribes de una forma y cuando lo utilizas/lees lo escribes de otra, revisa bien eso de igual forma al momento de recuperar tus variables de xml en objetos java checa que también tengas bien escrito el nombre del identicador dentro del metodo findViewById(), ahora que si gustas dejame tu correo y te mando el código pero no lo vayas a probar directo y ya perdon jajaja pero si primero comparalo para que veas donde esta tú error esa es otra recomendación compara linea por línea a veces por una letra o un punto y coma esta el detallito, otra muy importante revisa tus imports al inicio en caso de que sea eso con la combinación Crtl+Shift+O(o de oscar) se importan las clases que hagan falta. Otra recomendación como en este caso se usan varios if-else revisa que dentro de la comparación tengas un doble igual así: == porque uno solo significa asignación no comparación de igualdad, espero haberte ayudado, cualquier otra duda con todo gusto o te mando el código como gustes

        • Oscar Heredia

          gracias sigo revisando y nada, podrias mandarme el código para revisar linea por linea oheredia.456@gmail.com

  • Enrique Gudiño

    ah otra cosa, el sensor de tipo temperatura y orientación ya son obsoletos (deprecated)