miércoles, 10 de febrero de 2016

Trabajando con Sensores en Android. Parte V.

En esta quinta parte, vamos a explicar cómo desarrollar una app para android que utilice el sensor de proximidad. Para ello, es recomendable leer este tutorial a la par que visualizáis el código en GitHub.

Esta aplicación consiste en detectar un objeto acercarse al dispositivo, en este caso nuestra cara ya que se trata de una aplicación que nos va a ayudar a hacer flexiones. Por cada vez que hagamos una flexión y, estando el dispositivo en el suelo bajo nuestra cabeza, se incrementará un contador que nos informará de cuántas flexiones hemos hecho.

Para el funcionamiento de la aplicación hemos hecho uso de Sensor y SensorManager para administrar los eventos de los sensores, en este caso el de proximidad. También declaramos una variable contador, que incrementaremos cuando detectemos una aproximación al sensor.

Empezamos implementando la interfaz SensorEventListener en nuestra clase MainActivity que será la encargada de controlar los eventos del movimiento del dispositivo.

En el método onCreate inicializamos todos los objetos relacionados con el xml del layout y los sensores.

En el método onSensorChanged comprobamos si el evento registrado proviene del sensor de proximidad y si es así, comprobamos que que su valor sea el del máximo rango del sensor para que se actualice sólo cuando hemos realizado una flexión y nos alejamos del dispositivo. Cuando esto ocurre, incrementamos nuestro contador y lo actualizamos en el TextView.





Finalmente en el AndroidManifest ponemos la siguiente línea para que la aplicación sólo esté en vertical:

android:screenOrientation="portrait"


La referencia utilizada para el desarrollo de esta aplicación es:

http://developer.android.com/intl/es/reference/android/hardware/SensorEvent.html



Trabajando con los Sensores en Android. Parte IV.

En esta cuarta parte, vamos a explicar cómo desarrollar una app para android que utilice el acelerómetro. Para ello, es recomendable leer este tutorial a la par que visualizáis el código en GitHub.

Esta aplicación consiste en detectar un movimiento específico que detecten los sensores del dispositivo para el cual reproduciremos un sonido u otro. En concreto, los dos movimientos implementados son el gesto de dar un latigazo y el de agitar el dispositivo.

Para el funcionamiento de la aplicación hemos hecho uso del paquete SoundPool el cual nos permite reproducir archivos de sonido cortos de menos de 1 MB. Haremos uso de 3 variables para controlar el tiempo, las cuales comentaremos más adelante y de 2 variables para medir la gravedad en dos de los tres ejes espaciales.

Empezamos implementando la interfaz SensorEventListener en nuestra clase MainActivity que será la encargada de controlar los eventos del movimiento del dispositivo.

En el método onCreate inicializamos todos los objetos relacionados con el xml del layout y las variables para la reproducción de sonidos. Para cargar los sonidos, creamos una carpeta de tipo raw en nuestro proyecto y guardamos los sonidos ahí. De esta forma, podemos cargar los audios llamando al método load de la clase SoundPool con R.raw.nombre_sonido.

En el método onSensorChanged nos aseguramos de que todo esté sincronizado y obtenemos los valores x e y del acelerómetro (el valor z no lo hemos utilizado) y comprobamos el tipo de movimiento que se está realizando. Si el acelerómetro llega a -8 en la x y no se solapa con el tiempo del movimiento de agitar, activamos la variable primero y empezamos a contar el tiempo ya que este movimiento tiene dos fases. Si el dispositivo lo hemos llevado hasta una x mayor que 1 tras la primera fase y el tiempo es menor de 0.5 segundos (para que sea realista el movimiento debe hacerse rápido) entonces reproducimos el sonido del látigo donde la intensidad del sonido es inversamente proporcional al tiempo que tardamos en completar los dos pasos. Si el acelerómetro llega a valores superiores a 30 o inferiores a 30 y no estamos en proceso del movimiento del latigazo, entonces detectamos que se trata del movimiento de agitar el dispositivo por lo que reproducimos su sonido.



Los sonidos utilizados son totalmente libres y están extraídos de la página:

https://www.freesound.org/
 

Para el desarrollo de la aplicación hemos utilizado la siguiente referencia:

https://developer.android.com/intl/es/guide/topics/sensors/sensors_motion.html


Sigue leyendo en la siguiente entrada sobre el sensor de proximidad.


Trabajando con los Sensores en Android. Parte III.

En esta tercera parte, vamos a explicar cómo desarrollar una app para android que utilice los eventos táctiles de la pantalla. Para ello, es recomendable leer este tutorial a la par que visualizáis el código en GitHub.

Esta aplicación consiste en reconocer un patrón de gestos sobre la pantalla y una vez detectados, abrir la aplicación de la cámara si el patrón es el correcto. El patrón correcto escogido tiene forma de 'C', por lo que si no introducimos este patrón la aplicación nos dirá que es un gesto incorrecto y tendremos que repetir el proceso

Para el funcionamiento de la aplicación, declaramos un array cuadricula de tipo ImageView que representará la cuadrícula en la cual haremos el gesto. Así, haremos dos arrays más de tipo booleano, uno para guardar el patrón correcto y otro que se rellenará cuando el usuario toque las celdas de la cuadrícula.

Empezamos implementando las interfaces View.OnClickListener y View.OnTouchListener en nuestra clase MainActivity que serán las encargadas de recoger los eventos táctiles de la pantalla.

En el método onCreate inicializamos todos los objetos relacionados con el xml del layout e inicializamos el patrón correcto con la figura 'C' y el patrón del gesto a false.

Implementamos el método onTouch para recoger el evento del gesto que realice el usuario y comprobar si es correcto o no. Para ello, captamos la posición x e y donde estamos pulsando la pantalla y comprobamos si está en alguna casilla de la cuadrícula con la función estaEn, si es así establecemos esa posición del patrón del gesto a true y pintamos la casilla de amarillo. Cuando levantamos el dedo tras el gesto, comprobamos si el patrón de array es igual al que ya habíamos fijado con la figura 'C' y si es correcto pintamos las posiciones de verde y abrimos la cámara, de lo contrario pintaremos las posiciones de rojo durante 0.5 segundos y resetearemos todas las variables utilizadas para volver a intentarlo.

El método estaEn recibe una imagen del array de cuadrícula y una posición x e y de la pantalla. Lo que hace esta función es obtener la localización del punto x e y de la esquina superior izquierda de la primera celda de la cuadrícula y de la segunda para así restarlas y obtener lo que mide una celda. Sabiendo lo que mide la celda, es sencillo comprobar si la x e y que pasamos a la función se encuentra dentro del rango de posiciones de la celda de la cuadrícula.




Con respecto al xml, hemos utilizado un TableLayout de 3x3 con un background negro para que cuando introduzcamos un TableRow con sus tres ImageView, hagamos android:layout_margin="1dp" y deje una separación pequeña. Esto nos permite dibujar los bordes negros para diferenciar las celdas.

Finalmente en el AndroidManifest ponemos la siguiente línea para que la aplicación sólo esté en vertical y los permisos para utilizar la cámara y acceder al almacenamiento:

android:screenOrientation="portrait"
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


Para el desarrollo de esta aplicación hemos hecho uso de la siguiente referencia:

http://developer.android.com/intl/es/guide/topics/media/camera.html

Sigue leyendo en la siguiente entrada sobre el reconocimiento de movimientos.


Trabajando con los Sensores en Android. Parte II.


En esta segunda parte, vamos a explicar cómo desarrollar una app para android que utilice el GPS, la lectura de códigos QR, la API de Google Maps y un poco de Android Wear. Para ello, es recomendable leer este tutorial a la par que visualizáis el código en GitHub y el siguiente tutorial para crear el proyecto.

Esta aplicación consiste en leer unas coordenadas GPS desde un código QR y establecer esa localización como un destino al que llegar. Para ello haremos uso de un mapa que nos proporciona Google y un lector de QR que deberemos tener instalado.

Para el funcionamiento de la aplicación, declaramos las variables de GoogleMap, CameraUpdate y Location para poder posicionar un destino en la vista de nuestro mapa, así como la longitud/latitud del destino.

Empezamos implementando la interfaz GoogleMap.OnMyLocationChangeListener en nuestra clase MainActivity para poder actualizar el mapa en cuanto nuestro GPS detecte que nos hemos movido.

En el método onCreate inicializamos todos los objetos relacionados con el xml (MapFragment para el mapa y Button para el botón de lectura del código QR).

El método getCoordenadas intentará lanzar la aplicación de lectura del cógido QR si existe una app en el dispositivo que realice tal fin, de lo contrario lanzará una excepción y nos informará mediante un Toast que necesitamos tener instalada una app de lectura de QR.

Una vez de vuelta a nuestra aplicación, el método onActivityResult recupera los datos de la lectura del código y traduce el String devuelto al formato que nos interesa, guardar la longitud y la latitud.

En el método onMapReady establecemos nuestra localización (en el caso de que hayamos dado permiso a la aplicación del uso de nuestra posición y tengamos el GPS encendido) y hacemos que el mapa se pueda actualizar cada vez que nuestra posición se cambia en el mapa con mMap.setOnMyLocationChangeListener(this). Creamos el destino de tipo Location para después poder calcular la distancia de nuestra posición al objetivo. Acto seguido, añadimos una marca del destino en el mapa y acercamos la cámara hasta él con un zoom de 15 para poder tener una vista más centrada en nuestro objetivo.

El método onMyLocationChange, se ejecuta cada vez que nuestra posición cambia por lo que aquí mandamos notificaciones cada 10 metros informando de a qué distancia nos encontramos del objetivo y cuando la distancia sea menor de 5 metros, mandamos una notificación avisando que ya hemos llegado al destino. Estas notificaciones las podremos ver en el Android Wear. Para ello debemos configurar Android Wear instalando la aplicación Android Wear App en nuestro teléfono y activar las opciones de desarrollo en el reloj. Tras esto, debemos irnos a donde tengamos el adb de android (generalmente la carpeta .Android de nuestra carpeta principal) y ejecutamos una terminal con los siguientes comandos:


adb forward tcp:4444 localabstract:/adb-hub
adb connect localhost:4444

Hecho esto ya tenemos conectado nuestro PC al android wear y podremos depurar la aplicación.





Para poder obtener una ruta desde nuestra posición hasta el objetivo, pinchamos en la marca y le damos al botón de Google Maps. De esta forma, se nos abrirá la aplicación de Google donde podremos hacer la ruta mientras recibimos las notificaciones en el android wear sobre la distancia, como podemos ver en la siguiente imagen:



 

Las referencias utilizadas para el uso de la API de Google Maps como de Android Wear son las siguientes:

https://desarrollandoandroid.wordpress.com/2014/06/18/google-maps-en-android/
http://www.androidauthority.com/develop-simple-android-wear-app-622043/
http://www.elandroidelibre.com/2015/01/como-instalar-cualquier-aplicacion-en-android-wear.html

Sigue leyendo en la siguiente entrada sobre el reconocimiento de gestos.


Trabajando con los Sensores en Android. Parte I.



En esta primera parte, vamos a explicar cómo desarrollar una app para android que utilice el magnetómetro y el reconocimiento de voz. Para ello, es recomendable leer este tutorial a la par que visualizáis el código en GitHub.

Esta aplicación consiste en utilizar nuestra voz para comunicar a nuestro dispositivo una dirección y un error medido en grados, la cual se encarga de reconocer e interpretar, indicándonos con una brújula y una flecha si la dirección a la que nos dirigimos es la correcta (dentro de error establecido).

Para ello, declaramos dentro de MainActivity una serie de variables que guarden la dirección establecida por el usuario (desde 0 hasta 3, representando las 4 direcciones en sentido horario respectivamente) y el error (un número que nos indica cuántos grados de desviación con respecto a esa dirección permitimos para seguir diciendo que es correcta), así como el resto de variables necesarias para el reconocimiento de la voz y los cálculos con los ángulos y orientación del dispositivo.

En el método onCreate declaramos la imagen de la brújula (que girará en función de la orientación del móvil) y una imagen flecha cuya posición será estática, pero cambiará de color para indicarnos si la dirección es la correcta. De la misma forma, inicializamos los sensores que vamos a utilizar. Finalmente, llamamos a la función setSpeakButton que se encargará de crear un botón para comenzar el reconocimiento de la voz del usuario.

El método setSpeakButton ha sido añadido a partir del código proporcionado por el seminario de reconocimiento de voz impartido por Zoraida Callejas, de tal forma que al presionar el botón se reconoce el habla de la persona y se devuelve un array de Strings conteniendo posibles traducciones de la voz reconocida. Tanto esta función como todo aquel código relacionado con el reconocimiento de voz ha sido obtenido del mismo seminario.

Implementamos una función leerParametrosParaBrujula en la cual recorremos el array de respuestas obtenidas por el reconocimiento de voz en busca de un String que podamos interpretar como una dirección y un número (ej. norte 10). Con ello, dividimos el String en 2 y guardamos qué dirección y número se han reconocido.

En el método setRecognitionParams establecemos el número máximo de resultados a obtener por el reconocimiento de voz (10) así como el modelo de lenguaje.

Utilizamos el método onActivityResult para llamar al método leerParametrosParaBrujula y obtener los datos del reconocimiento de voz, con los que finalmente realizaremos las operaciones necesarias en el método onSensorChanged.

En esta función onSensorChanged nos encargamos de girar la imagen de la brújula en función de los datos obtenidos por los sensores (magnetómetro y acelerómetro). Por otro lado, comprobamos que si la dirección en la que apunta el móvil está en el intervalo definido por la dirección reconocida más y menos el error reconocido (en grados), dicha flecha cambiará a color verde. De no ser así, la flecha permanecerá roja.

Finalmente en el AndroidManifest ponemos la siguiente línea para que la aplicación sólo esté en vertical:


android:screenOrientation="portrait"
 




Para la realización de esta aplicación hemos seguido y utilizado código del seminario mencionado anteriormente, así como de la página:

http://agamboadev.esy.es/como-crear-un-brujula-en-android/

Sigue leyendo en la siguiente entrada sobre la API de Google Maps.