Demo
En la Parte Anterior llamada Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 3 creamos el código para los 5 primeros métodos del archivo MainActivity.kt o la actividad principal de la aplicación, aún hay otros métodos que vamos terminar de crear en ella en esta Parte 4, asimismo crearemos algunos otros elementos para la aplicación, bien vamos con este Post.
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: “Donde buscar ayuda sobre Programación”:
Spotify | SoundCloud |
Bien ahora continuemos con el Post: Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 4.
Vamos a crear el método agregarTexto() que nos servirá para agregar los textos de los mensajes que se llevan acabo entre el cliente y el Bot.
Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código.
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 |
private fun agregarTexto(mensaje: String, type: Int) { // Coloco el FramLayout dentro de la variable layoutFrm val layoutFrm: FrameLayout // Según sea el rol, le cargamos el FrameLayout y llamamos a un método respectivo // Los métodos agregarTextoUsuario() y agregarTextoBot() los crearé más adelante when (type) { USUARIO -> layoutFrm = agregarTextoUsuario() BOT -> layoutFrm = agregarTextoBot() else -> layoutFrm = agregarTextoBot() } // Si el usuario hace clic en la caja de texto layoutFrm.isFocusableInTouchMode = true // Pasamos un LinearLayout linear_chat.addView(layoutFrm) // Mostramos los textos de los mensajes en un TextView val textview = layoutFrm.findViewById<TextView>(R.id.msg_chat) textview.setText(mensaje) // Si el usuario sale del modo escritura, ocultamos el teclado del dispositivo // El método 'ocultarTeclado()' lo crearemos más adelante configTeclado.ocultarTeclado(this) // Enfocamos el TextView Automáticamente layoutFrm.requestFocus() // Volvemos a cambiar el enfoque para editar el texto y continuar escribiendo cajadetexto.requestFocus() // Si es un cliente el que envía un mensaje al Bot, cargamos el método 'TexToSpeech' // 'TexToSpeech' junto a otras métodos procesa los mensajes de voz que seran enviados al Bot if(type!= USUARIO) asistente_voz?.speak(mensaje,TextToSpeech.QUEUE_FLUSH,null) } |
En el método anterior llamamos a los métodos agregarTextoUsuario() y agregarTextoBot(), cada uno de estos métodos lo que hace es colocar los mensajes dentro de diferentes layouts, en el layout mensaje_usuario.xml se colocan los mensajes del usuario y el layout mensaje_bot.xml se colocan los mensajes del bot.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Colocamos los mensajes del Usuario en el layout 'mensaje_usuario' fun agregarTextoUsuario(): FrameLayout { val inflater = LayoutInflater.from(this@MainActivity) return inflater.inflate(R.layout.mensaje_usuario, null) as FrameLayout } // Colocamos los mensajes del Bot en el layout 'mensaje_bot' fun agregarTextoBot(): FrameLayout { val inflater = LayoutInflater.from(this@MainActivity) return inflater.inflate(R.layout.mensaje_bot, null) as FrameLayout } |
Ahora vamos a crear un método llamado validar(), con este método vamos a verificar si el usuario envió un audio que sea entendible para el bot o si no escribió un mensaje.
Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código.
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 |
// Hacemos uso del método 'DetectIntentResponse' de Dialogflow para devolver algunos mensajes al usuario fun validar(response: DetectIntentResponse?) { try { if (response != null) { // fulfillmentText retorna un String (Texto) al usuario en la pantalla // fulfillmentMessagesList (Objeto) retorna una lista de objetos var respuestaBot: String = "" if(response.queryResult.fulfillmentText==" ") respuestaBot = response.queryResult.fulfillmentMessagesList[0].text.textList[0].toString() else respuestaBot = response.queryResult.fulfillmentText // Pasamos el método agregarTexto() agregarTexto(respuestaBot, BOT) } else { // Mostramos un mensaje si el audio que envio el usuario no se entiende agregarTexto(getString(R.string.audio_no_se_entiende), BOT) } }catch (e:Exception){ // Mostramos al usuario el texto 'Por Favor, ingresa un mensaje' agregarTexto(getString(R.string.ingresa_mensaje), BOT) } } |
En la función nativa de Android onActivityResult() manejamos y obtenemos el resultado de nuestra actividad. Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
override fun onActivityResult(codigoSolicitud: Int, codigoResultado: Int, datos: Intent?) { super.onActivityResult(codigoSolicitud, codigoResultado, datos) // Obtenemos el resultado de nuestra actividad principal // Si la variable codigoResultado esta ok y la variable datos no es null when(codigoSolicitud){ ENTRADA_DE_VOZ->{ if(codigoResultado == Activity.RESULT_OK && datos != null){ // getStringArrayListExtra recupera datos extendidos del Intent val resultado = datos.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) // El usuario puede agregar otro mensaje cajadetexto.text = Editable.Factory.getInstance().newEditable(resultado[0]) // El usuario puede hacer uso del micrófono enviarMensaje(microfono) } } } } |
Por último hacemos uso del método nativo onDestroy() de Android para detener el asistente de voz una vez que la aplicación sea cerrada.
1 2 3 4 5 6 7 8 9 10 11 |
override fun onDestroy() { super.onDestroy() // Si la aplicación es cerrada, detenemos el asistente de voz if(asistente_voz !=null){ asistente_voz?.stop() asistente_voz?.shutdown() } } |
Genial hasta aquí terminamos la cuarta parte de este tutorial en donde hemos creado 6 métodos útiles en la Actividad Principal (MainActivity.kt) para que la aplicación funcione sin problemas.
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 crearemos los archivos solicitarTarea.kt y configTeclado.kt, ambos se complementan con el código del archivo MainActivity.kt
- 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.