En esta página:
Demo
La Parte anterior Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 4 nos puso a trabajar con código Kotlin, creamos 6 métodos en nuestra actividad, específicamente en el archivo (MainActivity.kt) para que la aplicación funcione sin problemas, en esta 5ta parte vamos a creare el código para 2 archivos que son necesarios para que nuestra aplicación funcione, estos son solicitarTarea.kt y Util.kt, vamos con ello.
Partes
Antes de continuar te invito a leer los siguientes artículos:
- Que es Android y tu Primera aplicación Hola Mundo
- Como Leer un archivo JSON en Android (Android Studio 3.6.1 + Java) – Parte 1
- Que es Kotlin y otros detalles
- Tipos de Variables en Kotlin
- Que es la Inteligencia Artificial y otros Detalles
- Que es Machine Learning, Historia y otros detalles
- Las Novedades más Destacadas que trae Android Studio 4.0
- Puedes leer más artículos en la categoría Android
Asimismo te invito a escuchar el Podcast: “Porque Algunos Desarrolladores no Terminan El Proyecto de Un Cliente”:
Spotify: | Sound Cloud: |
Bien ahora continuemos con el Post: Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 5.
Cuando el usuario se comunica con el Bot, de fondo se realizan ciertas tareas que procesan los mensajes entre ambos usuarios, para que estas tareas de fondo se lleven acabo vamos a crear un archivo kotlin a continuación.
Tarea de Fondo
Creo un archivo llamado solicitarTarea.kt en app > java > com.example.tiendapostresbot > solicitarTarea.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/app ├── /manifests ├── /java ├── /com.example.tiendapostresbot ├── MainActivity.kt ├── solicitarTarea.kt // Creo este Archivo ├── /com.example.tiendapostresbot (androidTest) ├── /com.example.tiendapostresbot (test) ├── /java (generated) ├── /res /Gradle Scripts |
Dentro del archivo solicitarTarea.kt importo las siguientes dependencias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.example.tiendapostresbot // Importo las siguientes dependencias import android.app.Activity; import android.os.AsyncTask; import com.google.cloud.dialogflow.v2.* class solicitarTarea : AsyncTask<Void, Void, DetectIntentResponse> { // Acá va el código para la presente clase } |
A la clase solicitarTarea le agregamos AsyncTask de Android, y comenzamos creando 4 variables llamadas actividad, sesion, sesionesCliente y entradaConsulta, dentro de cada variable le coloco valores de los métodos que usare de Android como Activity, SessionName, SessionsCliente y QueryInput.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.example.tiendapostresbot import android.app.Activity; import android.os.AsyncTask; import com.google.cloud.dialogflow.v2.* class solicitarTarea : AsyncTask<Void, Void, DetectIntentResponse> { // Declaramos estas variables var actividad: Activity? = null private var sesion: SessionName? = null private var sesionesCliente: SessionsClient? = null private var entradaConsulta: QueryInput? = null } |
Ahora implementaremos el método doInBackground() de Android para ejecutar una tarea o hilo de fondo, dentro de el usamos try{} para realizar una o varias tarea de fondo, se podría decir que varias ya que constantemente se estará enviando mensajes entre el usuario y el bot en el chat. Por ultimo si hay algún erro, devolvemos una excepción con catch{}.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Ejecutamos las tareas de fondo con el método de Android 'doInBackground' override fun doInBackground(vararg params: Void?): DetectIntentResponse? { // Usamos 'try' para realizar las tareas de fondo try { val detectarIntentosolicitarTarea = DetectIntentRequest.newBuilder() .setSession(sesion.toString()) .setQueryInput(entradaConsulta) .build() return sesionesCliente?.detectIntent(detectarIntentosolicitarTarea) } // Si hay algún error, devolvemos una exception en 'catch' catch (e: Exception) { e.printStackTrace() } return null } |
Por último hago uso del método onPostExecute de Android que ejecuta los hilos o tareas luego que se ejecuta el método anterior llamado doInBackground de Android.
En el interior de este método pasamos el resultado al método validar() que se encuentra en la actividad principal o archivo MainActivity.kt
1 2 3 4 5 6 7 8 |
// El método de Android 'onPostExecute' ejecuta determinados hilos de la interface luego que se ejecutó // el método anterior llamado 'doInBackground' override fun onPostExecute(result: DetectIntentResponse?) { //Pasamos el resultado al método validar() que se encuentra en la actividad principal 'MainActivity' (actividad as MainActivity).validar(result) } |
A continuación el código completo del archivo solicitarTarea.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package com.example.tiendapostresbot import android.app.Activity; import android.os.AsyncTask; import com.google.cloud.dialogflow.v2.* class solicitarTarea : AsyncTask<Void, Void, DetectIntentResponse> { // Declaramos estas variables var actividad: Activity? = null private var sesion: SessionName? = null private var sesionesCliente: SessionsClient? = null private var entradaConsulta: QueryInput? = null // Usamos las variables en un constructor constructor(actividad: Activity, sesion: SessionName, sesionesCliente: SessionsClient, entradaConsulta: QueryInput){ this.actividad = actividad this.sesion = sesion this.sesionesCliente = sesionesCliente this.entradaConsulta = entradaConsulta } // Ejecutamos las tareas de fondo con el método de Android 'doInBackground' override fun doInBackground(vararg params: Void?): DetectIntentResponse? { // Usamos 'try' para realizar las tareas de fondo try { val detectarIntentosolicitarTarea = DetectIntentRequest.newBuilder() .setSession(sesion.toString()) .setQueryInput(entradaConsulta) .build() return sesionesCliente?.detectIntent(detectarIntentosolicitarTarea) } // Si hay algún error, devolvemos una exception en 'catch' catch (e: Exception) { e.printStackTrace() } return null } // El método de Android 'onPostExecute' ejecuta determinados hilos de la interface luego que se ejecutó // el método anterior llamado 'doInBackground' override fun onPostExecute(result: DetectIntentResponse?) { //Pasamos el resultado al método validar() que se encuentra en la actividad principal 'MainActivity' (actividad as MainActivity).validar(result) } } |
Ocultando el Teclado en el Chat
Cuando el usuario decide enviar un mensaje de audio o no decide usar el teclado para escribir mensajes de texto en el chat, este teclado lo vamos a ocultar de la interface del chat, para esto crearé un archivo de tipo objeto de kotlin llamado configTeclado.kt, este archivo lo creo en app > java > com.example.tiendapostresbot > configTeclado.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/app ├── /manifests ├── /java ├── /com.example.tiendapostresbot ├── configTeclado.kt // Creo este Archivo ├── MainActivity.kt ├── solicitarTarea.kt ├── /com.example.tiendapostresbot (androidTest) ├── /com.example.tiendapostresbot (test) ├── /java (generated) ├── /res /Gradle Scripts |
En el archivo configTeclado.kt comienzo importando las siguientes dependencias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.example.tiendapostresbot // Importo las siguientes dependencias import android.app.Activity import android.content.Context import android.view.View import android.view.inputmethod.InputMethodManager import java.lang.Exception object configTeclado { // Acá va el código del presente objeto } |
Dentro del objeto configTeclado creo una función con el nombre ocultarTeclado(), y dentro de ella he agregado una variable llamada metodoentrada la cual la uso con otros métodos. En el código he colocado comentarios para explicar que hace cada parte del código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
object configTeclado { // Mediante esta función ocultamos el teclado cuando no se use en la interface de la aplicación fun ocultarTeclado(context: Activity, view: View) { // Dentro de la variable 'metodoentrada' hacemos uso de getSystemService y le pasamos el método // 'InputMethodManager' el cual detecta el método de entrada que es el teclado val metodoentrada = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager // A la variable 'metodoentrada' le pasamos el método 'hideSoftInputFromWindow' que solicita al sistema // ocultar el método de entrada de la aplicación, el cual es el teclado y le obtenemos un token con // el método 'getWindowToken', por último le pasamos el método 'InputMethodManager' con // la función 'HIDE_NOT_ALWAYS' que mantiene siempre en estado oculto el teclado metodoentrada.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS) } } |
Por ultimo crea otra función con el mismo nombre que la anterior es decir ocultarTeclado(), pero en esta función voy a ejecutar la función anterior haciendo uso de try{} y si hay algún error muestro una excepción con catch{}
1 2 3 4 5 6 7 8 9 10 11 |
// Llamamos a la función 'ocultarTeclado' mediante un 'try' fun ocultarTeclado(context: Activity) { try { ocultarTeclado(context, context.currentFocus!!) } // Si hay un error lanzamos una excepción mediante 'catch' catch (e: Exception) { } } |
Bien hasta aquí terminamos esta Parte 5, en donde hemos creado el código para el archivo o clase solicitarTarea.kt y también para el objeto o archivo configTeclado.kt
Ten Paciencia, lo que quiero es que entiendas todo el proceso para Crear este Proyecto y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- En la siguiente Parte ahondaremos a detalle la integración entre nuestra aplicación y Dialogflow (Herramienta de Inteligencia Artificial y Aprendizaje Automático), entre otros detalles.
- El código expuesto en este capitulo del tutorial pueden cambiar, esto no depende de mi, si no de la empresa que dan soporte a Android Studio, y Kotlin que suelen cambiar sus tecnologías en futuras versiones.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.