Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

Android Things: Entendiendo y Escribiendo Controladores

by
Difficulty:BeginnerLength:MediumLanguages:
This post is part of a series called Android Things.
Android Things: Peripheral Input/Output
Android Things and Machine Learning

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

En el artículo anterior de esta serie, aprendiste sobre los distintos tipos de dispositivos periféricos de entrada y salida y conexiones que pueden ser usadas con Android Things. Después, puedes expandir este conocimiento para escribir nuevas clases conocidas como controladores, que hacen las interfaces con periféricos incluso más sencillas. Este artículo se centrará en el tipo de controladores que pueden ser escritos para Android Things.

Controladores de Espacio-Usuario Android Things

Los controladores de espacio-usuario permiten a los desarrolladores inyectar nuevo hardware al framework Android, permitiéndoles interactuar con las APIs Android ya establecidas. Mientras que puedes comunicarte directamente con dispositivos usando las APIs de entrada/salida estándar, escribir un controlador personalizado le permitirá a tu app soportar varios perfiles de hardware y trabajar directamente con el SO Android. Además, tu código estará más estructurado y soportará fácilmente re-uso de código.

Hay tres clasificaciones primarias de controladores sobre las que aprenderás en este artículo: controladores GPS, controladores Human Input Device (HID), y controladores de sensores.

Controladores GPS

Si tu dispositivo necesita información de ubicación, entonces podrías querer agregar un dispositivo GPS a tu aplicación. Registrando tu periférico GPS con UserDriverManager, podrás inyectar la información de ubicación de tu dispositivo al framework Android, permitiéndole ser usado por los servicios de ubicación de Android. Esto combinará los datos GPS con WiFi y cualquier otra fuente de ubicación para proporcionar resultados más precisos para tu app.

Típicamente, tus módulos GPS conectarán a un dispositivo Android Things a través de una conexión UART. No nos adentraremos mucho en UART en este tutorial, pero puedes aprender todo sobre cómo funciona para periféricos en el tutorial anterior de la serie.

GPS module and Adafruit breakout board

Para trabajar con tu módulo GPS, necesitarás crear un nuevo componente Java para comunicarte con tu nuevo dispositivo. Llamaremos a esta clase GpsDriverService.

Para poder registrar tu módulo GPS con el framework Android para datos de ubicación, primero necesitarás crear un objeto GpsDriver en tu GpsDriverService. Este objeto puede ser registrado con el UserDriverManager con la llamada registerGpsDriver().

Una vez que tu módulo GPS ha recibido datos de ubicación y los ha enviado a tu dispositivo Android Things sobre tu conexión serial UART, necesitarás analizarlos y agregarlos a un objeto Location.

La mayoría de los módulos GPS devolverán datos de ubiación en el formato NMEA, aunque analizar estos datos está más allá del alcance de este tutorial. Hay cuatro elementos de datos requeridos para tu objeto Location: precisión, tiempo, latitud y longitud. También puedes incluir opcionalmente altitud, orientación, y velocidad (si el dispositivo se está moviendo).

Una vez que tienes tu objeto Location poblado, puedes pasarlo al GpsDriver llamando reportLocation().

Una vez que tu componente es creado, necesitarás instanciarlo, comenzar a leer datos, y escuchar actualizaciones en tu aplicación.

Cundo tu aplicación está terminada, necesitaras quitar el registro a tu controlador y quitar tu listener de ubicación.

Además, necesitarás asegurar que tu aplicación tiene el permiso ACCESS_FINE_LOCATION. Puedes encontrar detalles para asegurar que una aplicación tiene los permisos requeridos en este tutorial.

Cuando trabajas por primera vez con una aplicación que usa un permiso nuevo en Android Things, necesitarás reiniciar tu dispositivo después de instalar tu aplicación para asegurar que el permiso ha sido concedido.

Controladores Human Input Device

El framework Android viene con una tubería integrada para manejar entrada de eventos de botón y movimiento de usuario, el cuál es usado para cosas como botones de medios, controladores de joysticks, y presiones de teclas de teclado. Creando un InputDriver, puedes atar tus propias interacciones humanas al flujo de entrada estándar para que tu dispositivo pueda reaccionar apropiadamente a tus usuarios.

Para simplicidad, solo veremos eventos de entrada de botón y cómo atarlos al framework Android, aunque los eventos de movimiento son manejados de manera muy similar. De manera similar a la última porción de este tutorial, ignoraremos los detalles de implementación más específicos de los dispositivos de entrada y nos concentraremos en atar eventos recibidos a la plataforma Android.

Eventos de Botón

Cuando un evento de botón ocurre desde un botón que has adjuntado a tu dispositivo Android Things, querrás registrar eso y enviarlo a través del flujo Android.

La primera cosa que necesitarás hacer es crear un objeto InputDriver en un nuevo Service e inicializarlo. El controlador puede ser inicializado usando un constructor que acepte el tipo de entrada, un nombre para tu entrada, una versión, y una llave de código que ese botón representa.

Una vez que tu InputDriver es inicializado, puedes registrarlo con el UserDriverManager usando la llamada registerInputDriver().

Una vez que has registrado tu InputDriver, tu servicio de controlador puede esperar eventos a ser enviados a este desde tu clase de implementación de botón. Si tu botón personalizado es presionado, puedes notificar al servicio y crear un nuevo KeyEvent, el cuál puede ser colocado en el flujo Android usando el método emit(KeyEvent). Este método devolverá verdadero si el KeyEvent puede ser enviado al framework Android, o falso si ocurre un error.

La cosa final que necesitarás hacer es quitar el registro a tu objeto InputDriver del UserDriverManager cuando tu aplicación ha terminando de ejecutarse.

Escuchando Eventos de Entrada

Ahora que puedes emitir eventos de entrada de botón al flujo Android, es tiempo de escucharlos. Aquí es donde todo el trabajo para canalizar tus nuevos eventos de botón al framework Android da resultados. En el Activity de tu aplicación, simplemente necesitas agregar un método para cuando un KeyEvent está abajo, y otro para cuando un KeyEvent está arriba. En esos métodos, puedes reivisar el código de clave de KeyEvent y manejar el evento apropiadamente.

Controladores de Sensor

Algunos de los componentes más comunes que usarás con una tarjeta Android Things son los sensores. Ya que Android tiene un framework de sensores bastante robusto, solo tiene sentido que quisiéramos poder agregar datos desde nuestros componentes externos a ese flujo.

Para comenzar, necesitarás hacer una nueva clase Java que interactue con tu sensor de hardware. Esta clase necesitará extender UserSensorDriver e implementar el método read(). En adición, si tu sensor soporta modos de bajo poder o dormir, puedes anular el método setEnabled() y actuar de manera acorde.

El siguiente pedazo de código es una versión reducida de una clase de componente que leería datos a través de la API Peripherial I/O para recuperar un valor X, Y y Z y devolver un nuevo UserSensorReading. Si la información no está actualmente disponible, tu clase puede arrojar un nuevo IOException.

Una vez que tu clase componente es creada, puedes crear un nuevo Service que la instanciará, así como crear un nuevo objeto UserSensor y adjuntarlo al flujo de sensor Android.

Hay dos tipos de sensores que puedes agregar a este flujo. El primero son tipos predefinidos, como giroscopios, acelerómetros, luz, y proximidad, y pueden ser agregados al flujo así:

Notarás que un SensorManager.DynamicSensorCallback es usado en el ejemplo de arriba. Esto notifica a tu app cuando el sensor está disponible para el framework, ya que el registro puede llevar algún tiempo, para que el framework no intente leer datos de un dispositivo no disponible.

Adafruit pressure and temperature sensor

El segundo tipo es personalizado, el cuál cubre cualquier cosa aún no soportada en Android. Algunos ejemplos incluyen niveles de pH de agua, velocidad del viento, detección de movimiento, o cualquier otra cosa que puedas medir con nuevo hardware.

Reemplazando el parámetro constructor setType() con setCustomType(), puedes agregar el nombre de tu dispositivo y modo de reporte para controlar cómo se disparará en el flujo.

Finalmente, cuando tu aplicación termina de ejecutarse, necesitarás quitar el registro a tu nuevo componente desde el UserDriverManager.

Conclusión

En este tutorial, has aprendido cómo tomar componentes construidos usando la API Peripherial I/O y atarlos a los frameworks Android apropiados para usar en tus aplicaciones Android Things.

En este punto en la serie, tienes todas las herramientas necesarias para crear algunos proyectos Android Things más a fondo. En adición a escribir tus propios controladores, puedes encontrar controladores que fueron escritos e implementarlos en tu propio proyecto. Puedes encontrar la fuente para estos controladores desde la repo GitHub Android Things, o revisa algunas muestras en funcionamiento usando estos controladores.

En el siguiente artículo de esta serie, iremos un paso más allá y crearemos un proyecto completo Android Things que tome imágenes desde un Raspberry Pi y las cargue a Firebase. Mientras tanto, ¡revisa algunos de nuestros otros tutoriales sobre desarrollo de aplicaciones Android aquí en Envato Tuts+!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.