Los Sensores de Movimiento 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 tipo movimiento que como hemos visto, son los sensores que miden las fuerzas de aceleración y fuerzas de rotación a lo largo de tres ejes. En esta categoría incluimos los acelerómetros, sensores de gravedad, giroscopios y sensores de rotación del vector. ¡¡empecemos!!

Eclipse, Java, Android

Normalmente de todos estos sensores, dos son siempre basados en hardware (acelerómetro y giroscopio), y el resto, pueden ser o basados en hardware, o basados en software (la gravedad, la aceleración lineal, y los sensores de vector de giro). Por ejemplo, en algunos dispositivos, los sensores basados en software obtienen sus datos del acelerómetro y magnetómetro, pero en otros dispositivos también pueden utilizar el giroscopio para obtener sus datos.

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 movimiento 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_ACCELEROMETER),
				SensorManager.SENSOR_DELAY_NORMAL);

		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR),
				SensorManager.SENSOR_DELAY_NORMAL);
				
		mSensorManager.registerListener(this,
				mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
				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 de como capturar los datos de los Sensores Android con SensorEvent.

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_ACCELEROMETER:

				txt += "acelerometro\n";
				txt += "\n x: " + event.values[0] + " m/s";
				txt += "\n y: " + event.values[1] + " m/s";
				txt += "\n z: " + event.values[2] + " m/s";
				acelerometro.setText(txt);

				}

				break;

			case Sensor.TYPE_ROTATION_VECTOR:
				txt += "rotation vector\n";
				txt += "\n x: " + event.values[0];
				txt += "\n y: " + event.values[1];
				txt += "\n z: " + event.values[2];

				// Creo objeto para saber como esta la pantalla
				Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
						.getDefaultDisplay();
				int rotation = display.getRotation();

				// El objeto devuelve 3 estados 0,1 y 3
				if (rotation == 0) {
					txt += "\n\n Pos: Vertical";

				} else if (rotation == 1) {
					txt += "\n\n Pos: Horizontal Izq.";

				} else if (rotation == 3) {
					txt += "\n\n Pos: Horizontal Der";
				}

				txt += "\n\n display: " + rotation;

				giro.setText(txt);

				break;

			case Sensor.TYPE_GRAVITY:
				txt += "Gravedad\n";
				txt += "\n x: " + event.values[0];
				txt += "\n y: " + event.values[1];
				txt += "\n z: " + event.values[2];

				gravedad.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

Como ves, todos los sensores de movimiento devuelven arrays multidimensionales, cada sensor devolvera un array mas o menos profundo dependiendo de la informacion que nos de, para el caso de arriba y (sensor de aceleracion), el objeto SensorEvent arroja un array con 3 elementos, puedes consultar la documentación oficial para ver todos los detalles del resto de sensores, no te asustes, veras la tabla de arriba que tiene 3 columnas, tipo de sensor, array, descripcion del dato que arroja y por ultimo la unidad con la que nos da el dato. Te recomiendo que te descargues el ejemplo completo aquí y juegues con el, ya veras que es muy fácil, divertido y curioso.

Desactivar los sensores de movimiento 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_ACCELEROMETER));

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

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

						

Bueno, creo que esta bien por ahora! en la siguiente lección veremos los sensores Ambientales con algunos ejemplos de uso. 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.