Los Sensores de Posicion Android

Hola de nuevo chic@s! como vimos en la lección anterior, nuestro teléfono Android dispone de 3 grandes agrupaciones de sensores, aquí veremos los sensores de posicion. La plataforma Android dispone de dos sensores que le permiten determinar la posición de un dispositivo: el sensor de campo magnético terrestre y el sensor de orientación. La plataforma Android también proporciona un sensor que le permite determinar qué tan cerca de la cara de un dispositivo a un objeto (conocido como el sensor de proximidad) que principalmente se utiliza para bloquear la pantalla tactil cuando tenemos pegado el telefono a la cara cuando hablamos y no colgar la llamada con la oreja ;P. ¡¡empecemos!!

Eclipse, Java, Android

El sensor de campo magnético terrestre y el sensor de proximidad están basados en hardware. La mayoría de los fabricantes de teléfonos y tabletas incluyen un sensor de campo magnético terrestre. Del mismo modo, los fabricantes de teléfonos móviles por lo general incluyen un sensor de proximidad. El sensor de orientación está basada en software y obtiene sus datos del acelerómetro y el sensor de campo magnético terrestre.

Sensores de posición son útiles para determinar la posición física de un dispositivo en relacion con el mundo o la tierra. Por ejemplo, puede utilizar el sensor de campo magnético terrestre en combinación con el acelerómetro para determinar la posición relativa de un dispositivo con respecto al Polo Norte magnético. También puede utilizar el sensor de orientación (o métodos de orientación basados en sensores similares) para determinar la posición de un dispositivo (si esta en horizontal o vertical) y lanzar mensajes al usuario sobre esto.

Bueno, ya esta bien de cháchara! ya va siendo hora de ir viendo código y ejemplos prácticos de como usar estos sensores, ya veras que es muy muy fácil.

Activar los sensores de Posicion en Android

Para comenzar a usar los sensores, necesitaremos primero acceder al servicio SensorManager para poder decirle que sensores queremos activar, para lo primero pondremos el siguiente código:

// Creamos el objeto para acceder al servicio de sensores
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
						

Para el segundo paso, cogemos el objeto que hemos creado mSensorManager y activamos los sensores que necesitemos, para ello tendremos que usar el siguiente código:

// iniciar sensores

		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
				SensorManager.SENSOR_DELAY_NORMAL);

		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION ),
				SensorManager.SENSOR_DELAY_NORMAL);
				
		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
				SensorManager.SENSOR_DELAY_NORMAL);		
				
						

Como ves, la cosa es fácil! es un código muy sencillo!! al objeto mSensorManager le decimos que queremos leer, y le pasamos 2 parámetros, por un lado el sensor que vamos a activar, y por otro la resolución o por decirlo de otra manera la velocidad con la que queremos leerlo, para por ejemplo en caso de los juegos que necesitamos una mayor respuesta (si por ejemplo requerimos conducir un coche) en el segundo parámetro pondremos SENSOR_DELAY_GAME lo malo o por contra tenemos que cuanto mas rápido consultamos el sensor, mas batería consume, así que a no ser que uses para algo que sepas lo que haces, usa el modo SENSOR_DELAY_NORMAL.

Eclipse, Java, Android

 

Ejemplo para capturar los datos de los sensores con SensorEvent Android

Ahora biene lo "complicado" que es capturar los eventos que lanzan los sensores que hemos activado, como veras no es complicado, otras lecciones que hemos visto me parecen mas complejas (como los mapas) si lo analizas con detenimiento veras que no es difícil, tienes el ejemplo completo en el apartado de ejemplos de esta unidad.

Nota: cuando ves el símbolo\n es que sumas una línea, es como meter un "Enter" en la cadena de texto, esto es muy útil, porque te permite organizar mejor los datos y no amontonarlos en una sola línea. ;P

// Metodo que escucha el cambio de los sensores
	@Override
	public void onSensorChanged(SensorEvent event) {
		String txt = "\n\nSensor: ";

		// Cada sensor puede lanzar un thread que pase por aqui
		// Para asegurarnos ante los accesos simult‡neos sincronizamos esto

		synchronized (this) {

			switch (event.sensor.getType()) {

			case Sensor.TYPE_ORIENTATION:
				txt += "orientation\n";
				txt += "\n azimut: " + getDireccion(event.values[0]);
				txt += "\n y: " + event.values[1] + "¼";
				txt += "\n z: " + event.values[2] + "¼";
				orientacion.setText(txt);
				break;
				
			case Sensor.TYPE_MAGNETIC_FIELD:
				txt += "magnetic field\n";
				txt += "\n x: " + event.values[0] + " uT";
				txt += "\n y: " + event.values[1] + " uT";
				txt += "\n z: " + event.values[2] + " uT";

				magnetic.setText(txt);

				break;

			case Sensor.TYPE_PROXIMITY:
				txt += "proximity\n";
				txt += "\n" + event.values[0];

				proximity.setText(txt);

				break;
			
			}
		}
	}

El código de arriba es muy bueno para comenzar a juguetear con los sensores, lo importante es que veas que hay un switch (event.sensor.getType()) que captura los sensores que nos interesa leer y que hemos activado, con el case Sensor.TYPE_xxxx lo que hacemos es poner el codigo especifico y que nos interese para cada sensor, que no es mas ni menos que leer el objeto SensorEvent, y tomar las decisiones o acciones que necesitemos hacer, "el tema" es saber que datos arroja cada sensor para saber recogerlos. Por ejemplo! veamos la siguiente tabla.

Eclipse, Java, Android
Eclipse, Java, Android

Explico un poco lo de arriba! El sensor de campo magnético terrestre y el sensor de orientación devuelven matrices multidimensionales (una Matriz de 3 dimensiones) de valores de los sensores para cada SensorEvent. Por ejemplo, el sensor de orientación proporciona geomagnéticas los valores de intensidad de campo para cada uno de los tres ejes de coordenadas durante un único evento de sensor. Del mismo modo, el sensor de orientación proporciona acimut (yaw, pitch, roll) que son los grados de rotacion para cada eje (mira la imagen de la derecha) estos datoslos vuelca a la matriz de 3 dimensiones. Para obtener más información acerca de los sistemas de coordenadas que se utilizan por los sensores, consulta Sistemas de coordenadas. El sensor de proximidad proporciona un único valor para cada evento de sensor. Cada fabricante "invierte" mas o menos en este sensor, hay sensores que tienen mas resolucion o por decirlo de otra forma son mas "finos" y hay otros que son mas bastos, que te dicen si hay algo cerca o no (tuve un telefono que o detectaba 5cm o 0cm) sin embargo el nexus4 detecta de 1cm en 1cm.

La tabla de arriba presenta un resumen de los sensores de posicion que se apoyan en la plataforma Android, puedes consultar la documentacion oficial aqui. Te recomiendo que te descargues mi ejemplo completo aquí y juegues con el, ya veras que es muy fácil, divertido y curioso.

Ejemplo de como desactivar los sensores de posicion en Android

Para desactivar los sensores es muy sencillo (recuerda hacerlo cuando salgas de la aplicación o dejes de usarlos, el uso de los sensores incrementa el consumo de batería) usa este código:

// Método para parar la escucha de los sensores

		mSensorManager.unregisterListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD));

		mSensorManager.unregisterListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION));

		mSensorManager.unregisterListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY));
				

Bueno, creo que esta bien por ahora! Como digo siempre, no es complicado, como todo requiere practica y hacer varias pruebas, pero vamos si yo pude. ¡tu también! animo y si no te aclaras, pregunta en el foro.

Si te a gustado este sitio, por favor haz click en me gusta en Facebook, Google+, Tweeter... es el único precio que te pido por este trabajo! ;P. Compartiendo, ayudaras a otros a encontrar esta web! GRACIASSSS.