Saltar al contenido principal
Este documento forma parte del escenario de arquitectura Mobile + API y explica cómo implementar la aplicación móvil para Android. Consulte el escenario para obtener más información sobre la solución implementada.

Paso 1. Configura la aplicación

Proyecto de ejemplo

Descarga un proyecto de ejemplo específico de este tutorial para empezar. Descargar Haz un fork en GitHub Requisitos del sistema
  • Android Studio 2.3
  • Android SDK 25
  • Emulador - Nexus 5X - Android 6.0
Mostrar requisitos

Configura las dependencias

Para esta implementación, usaremos las siguientes dependencias en el archivo build.gradle de la app:
  • Auth0.Android: este paquete permite integrar Auth0 para autenticar usuarios.
  • OkHttp: este paquete proporciona un cliente HTTP para realizar solicitudes a la API de Node.JS.
  • JWTDecode.Android: este paquete ayudará a decodificar .
  • AppCompat: este paquete nos permite usar el widget de la barra de herramientas para la navegación en nuestras actividades.

Actualiza el manifiesto

Abre el archivo AndroidManifest.xml de la aplicación y agrega el permiso de acceso a Internet:
También actualizaremos los detalles de la aplicación para usar el widget Toolbar:

Establecer los valores de configuración

Establece tu Auth0 , el dominio de Auth0 y la URL de la API en el recurso strings.xml ubicado en /res/values/strings.xml:
Para esta implementación, cree directorios para actividades, modelos y utilidades dentro del paquete de la aplicación.
  • activities/: este paquete contendrá LoginActivity.java, TimeSheetActivity.java, FormActivity.java y UserActivity.java.
  • models/: este paquete contendrá los modelos de datos TimeSheet.java y User.java.
  • utils/: este paquete contendrá UserProfileManager.java, TimeSheetAdapter.java e ImageTask.java

Paso 2. Autorice al usuario

Actualiza el manifiesto

Abre el archivo AndroidManifest.xml de la aplicación y añade la LoginActivity:

Crear la actividad de inicio de sesión

LoginActivity se encargará de la autorización del usuario y será la primera pantalla que verán los usuarios. Crearemos un método login() para inicializar un WebAuthProvider e iniciar la autenticación. Asegúrate de proporcionar el scheme, la y el scope correctos al WebAuthProvider. Para esta implementación usaremos:
  • scheme: demo
  • audience: https://api.exampleco.com/timesheets (la API de Node.JS)
  • response_type: code
  • scope: create:timesheets read:timesheets openid profile email offline_access. Estos alcances nos permitirán realizar solicitudes POST y GET a la API de Node.JS, así como recuperar el perfil del usuario y un .
En el método login(), tras autenticarse correctamente, redirigiremos al usuario a TimeSheetActivity.

Almacenar las credenciales

Para almacenar las credenciales recibidas después de iniciar sesión, usaremos CredentialsManager de la biblioteca Auth0.Android y SharedPreferences para almacenarlas. Antes de inicializar WebAuthProvider en el método login(), podemos crear CredentialsManager. Al pasar un AuthenticationAPIClient a CredentialsManager, este podrá actualizar los si han expirado.
Ahora actualiza el método login() para que las credenciales se almacenen mediante CredentialsManager después de una autenticación exitosa.

Paso 3. Obtener el perfil del usuario

Crear el modelo de usuario

Cree un modelo de usuario sencillo que usarán UserProfileManager y UserActivity.

Almacenar el perfil del usuario

Para gestionar el almacenamiento de la información del perfil del usuario, crearemos una clase llamada UserProfileManager. UserProfileManager usará SharedPreferences para almacenar los datos.
A continuación, actualiza el método login() en LoginActivity para recuperar el y obtener el perfil del usuario a partir del token con la biblioteca JWTDecode.Android. Luego, almacena el perfil del usuario con UserProfileManager.

Paso 4. Mostrar elementos de la interfaz de usuario de forma condicional según el scope

Para determinar si un usuario tiene permisos para realizar determinadas acciones, podemos fijarnos en el scope que se le otorgó durante el proceso de autenticación. El scope contendrá una cadena con todos los alcances concedidos al usuario, así que, para determinar si se concedió un scope concreto, simplemente debemos comprobar si la cadena de alcances contiene la subcadena correspondiente a ese scope.

Almacenar el scope

Primero, podemos actualizar la clase User para almacenar los alcances otorgados y, a continuación, proporcionar un método auxiliar, hasScope(), que puede usarse para determinar si los alcances otorgados incluyen un scope determinado:
Recuerde también actualizar el UserProfileManager para almacenar el campo extra:
A continuación, actualiza LoginActivity para pasar también el scope, de modo que pueda almacenarse en el objeto User:

Mostrar el menú de aprobación según el scope

Ahora podemos mostrar determinados elementos de la interfaz de usuario según se le haya concedido o no al usuario un scope concreto. Por ejemplo, tenemos un elemento del menú de aprobación que solo debe ser visible para los usuarios a los que se les haya concedido el scope approve:timesheets. A continuación, puede ver el código de la clase BaseActivity, que comprueba si un usuario tiene el scope approve:timesheets y, en función de ello, establece la visibilidad del elemento del menú que muestra la actividad de aprobación:

Paso 5. Llama a la API

Actualiza el manifiesto

Abre el archivo AndroidManifest.xml de la aplicación y agrega la actividad TimeSheetActivity:

Cree los diseños de la actividad Timesheets

A continuación, cree timesheet_activity.xml, el diseño de TimeSheetsActivity:
El widget ListView contendrá entradas individuales, representadas por el diseño item_entry.xml:
Y para la navegación de la Toolbar en TimeSheetActivity, crearemos el recurso de menú timesheet_action_menu.xml (/res/menu/):

Crear el modelo de registro de horas

Cree un modelo para trabajar con los datos del registro de horas en nuestras vistas:

Crear el adaptador de registro de horas

TimeSheetAdapter es una clase de utilidad que toma un array de entradas de registro de horas y las aplica al ListView de TimeSheetActivity.

Crear la actividad de registro de horas

TimeSheetActivity muestra las entradas del registro de horas del usuario que ha iniciado sesión y que están almacenadas en el servidor.
  • @string/api_url se establece en http://10.0.2.2:8080/timesheets para que el emulador de Android pueda conectarse a la API de Node.JS que se ejecuta en http://localhost:8080.
  • El método callAPI() recupera los registros de horas de la API de Node.JS.
  • El método processResults() toma la respuesta JSON de callAPI() y la convierte en objetos TimeSheet.
  • Los métodos onCreateOptionsMenu() y onOptionsItemSelected() gestionan la funcionalidad de navegación del widget Toolbar.

Paso 6. Ver el perfil del usuario

Para mostrar el perfil del usuario que ha iniciado sesión, crearemos UserActivity, el diseño user_activity.xml correspondiente y user_action_menu.xml para la navegación de la Toolbar. La vista mostrará el nombre, el correo electrónico y la foto de perfil del usuario.

Actualiza el manifiesto

Abre el archivo AndroidManifest.xml de la aplicación y agrega UserActivity:

Crea los diseños de actividad del usuario

A continuación, crea user_activity.xml, el diseño de UserActivity, con un ImageView para la foto de perfil y TextViews para el nombre y el correo electrónico del usuario.
Y cree el archivo user_actions_menu.xml para la Toolbar de UserActivity:

Cargar la imagen de perfil desde la URL

Para cargar la imagen de perfil del usuario desde la URL, cree una tarea que extienda AsyncTask y se ejecute en segundo plano.

Crear la actividad del usuario

En el método onCreate() recuperaremos la información del usuario desde UserProfileManager y estableceremos los valores en la vista. Como antes, los métodos onCreateOptionsMenu() y onOptionsItemSelected() se encargan de la funcionalidad de navegación del widget Toolbar.

Paso 7. Formulario para nuevos registros de horas

A continuación, crea FormActivity y el diseño para gestionar la creación de nuevas entradas de registro de horas.

Actualiza el manifiesto

Abre el archivo AndroidManifest.xml de la aplicación y agrega FormActivity:

Crear los diseños de la actividad del formulario

Crea el diseño form_activity.xml con EditText para introducir el nombre del proyecto y las horas trabajadas, y un DatePicker para la fecha trabajada.
Y cree el form_actions_menu.xml para la Toolbar de FormActivity:

Crear la actividad del formulario

  • @string/api_url se configura como http://10.0.2.2:8080/timesheets para que el emulador de Android pueda conectarse a la API de Node.JS que se ejecuta en http://localhost:8080.
  • El método onCreate() inicializa el formulario y recopila la entrada para el método postAPI() cuando se pulsa el botón de envío.
  • El método postAPI() enviará la entrada del usuario obtenida del formulario a la API de Node.JS en formato JSON.
  • El método clearForm() borra los campos del formulario.
  • Los métodos onCreateOptionsMenu() y onOptionsItemSelected() gestionan la funcionalidad de navegación del widget Toolbar.

Pruebe la aplicación

Antes de continuar, asegúrese de haber implementado la API de Node.JS.
  1. Inicie la API. Para ello, vaya al directorio de la API en la terminal e introduzca el comando node server.
  2. Abra la aplicación móvil en Android Studio y presione el botón Run.
  3. Seleccione el dispositivo virtual Nexus 5X API 23.
  4. Una vez que el emulador haya cargado la aplicación móvil, puede iniciar sesión y, a continuación, crear y ver registros de horas desde la API de Node.JS en ejecución.
¡Eso es todo! ¡Ha terminado!