1. Code
  2. Mobile Development
  3. Android Development

Consejo Rápido: Cómo Usar la API Assist de Android

Los usuarios de Android hoy en día ya no tienen que abrir un navegador y realizar una búsqueda para aprender sobre cosas con las que se topan mientras usan una aplicación. ¡En su lugar pueden usar un asistente! Si tienes un dispositivo que corre Android 6.0 o superior, podrías estar familiarizado con su asistente por defecto, el cuál inicialmente fue llamado Google Now sobre Tap. Últimamente, su nombre ha sido cambiado a screen search.
Scroll to top

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

Los usuarios de Android hoy en día ya no tienen que abrir un navegador y realizar una búsqueda para aprender sobre cosas con las que se topan mientras usan una aplicación. ¡En su lugar pueden usar un asistente! Si tienes un dispositivo que corre Android 6.0 o superior, podrías estar familiarizado con su asistente por defecto, el cuál inicialmente fue llamado Google Now sobre Tap. Últimamente, su nombre ha sido cambiado a screen search.

Los asistentes, aunque son sensibles al contexto, usualmente no son muy precisos. Para mejorar la precisión, los desarrolladores de aplicaciónes deben usar la API Assist. En este consejo rápido, introduciré los básicos de la API y te ayudaré a comenzar creando tu propio asistente personalizado.

1. Habilitando el Asistente Por Defecto

Si nunca has usado el asistente en tu dispositivo o emulador, probablemente aún no esté habilitado. Para habilitarlo, presiona y mantén presionado el botón de inicio. En el diálogo que aparece, presiona el botón Sí, Estoy dentro.

Enabling Google screen searchEnabling Google screen searchEnabling Google screen search

Ahora podrás acceder al asistente por defecto desde cualquier aplicación simplemente presionando largamente el botón de inicio. Vale la pena notar que el asistente por defecto es parte de la aplicación de Google, y funciona mejor solo después de que te has registrado con tu cuenta de Google.

2. Enviando Información al Asistente

El asistente por defecto es muy poderoso. Puede proporcionar automáticamente información sensible al contexto basado en los contenidos actuales de la pantalla. Lo hace analizando jerárquicamente la vista de la actividad activa.

Para verlo en acción, crea una nueva actividad en tu proyecto de Android Studio y agrega el siguiente widget TextView, el cuál tiene el nombre de una popular novela, a este diseño:

1
<TextView
2
    android:layout_width="wrap_content"
3
    android:layout_height="wrap_content"
4
    android:text="Alice's Adventures in Wonderland"
5
    android:id="@+id/my_text"
6
    />

Si ejecutas tu aplicación ahora y presionas largamente el botón de inicio, el asistente por defecto mostrará tarjetas que se relacionan con los contenidos del widget TextView.

Cards displayed by the assistantCards displayed by the assistantCards displayed by the assistant

Enviando información adicional al asistente, puedes mejorar su precisión. Para hacerlo, debes anular el método onProvideAssistContent() de tu clase Activity.

1
@Override
2
public void onProvideAssistContent(AssistContent outContent) {
3
    super.onProvideAssistContent(outContent);
4
}

Ahora puedes usar el objeto AssistContent para enviar información al asistente. Por ejemplo, si quieres que el asistente muestre una tarjeta que permita al usuario leer acerca de la novela en Goodreads, puedes usar el método setWebUri().

1
outContent.setWebUri(
2
    Uri.parse(
3
      "https://www.goodreads.com/book/show/13023.Alice_in_Wonderland"
4
    )
5
);

Aquí está como se ve la nueva tarjeta:

Card for GoodreadsCard for GoodreadsCard for Goodreads

La API Assist también te permite pasar datos estructurados al asistente usando el método setStructuredData(), el cuál espera una cadena JSON-LD. La manera más fácil de general la cadena JSON-LD es usar la clase JSONObject y su método put().

El siguiente código de ejemplo te muestra cómo generar y enviar datos estructurados acerca de la novela:

1
outContent.setStructuredData(
2
    new JSONObject()
3
        .put("@type", "Book")
4
        .put("author", "Lewis Carroll")
5
        .put("name", "Alice in Wonderland")
6
        .put("description", 
7
            "This is an 1865 novel about a girl named Alice, " + 
8
            "who falls through a rabbit hole and " +
9
            "enters a fantasy world."
10
        ).toString()
11
);

Si eliges codificar a mano tu cadena JSON-LD, te sugiero que te asegures de que es valida usando la Herramienta de Prueba de Datos Estructurados de Google.

Validating JSON-LD with Structured Data Testing ToolValidating JSON-LD with Structured Data Testing ToolValidating JSON-LD with Structured Data Testing Tool

3. Creando un Asistente Personalizado

Si no estás satisfecho con la manera en la que el asistente de aplicación de Google maneja tus datos, deberías considerar crear tu propio asistente. Hacerlo no toma mucho esfuerzo.

Todos los asistentes personalizados deben tener lo siguiente:

  • un objeto VoiceInteractionService
  • un objeto VoiceInteractionSession
  • un objeto VoiceInteractionSessionService
  • un archivo de meta-datos XML describiendo al asistente personalizado

Primero, crea una nueva clase Java llamada MyAssistantSession y hazlo una subclase de la clase VoiceInteractionSession En este punto, Android Studio debería generar de manera automática un constructor para esta.

1
public class MyAssistantSession extends VoiceInteractionSession {
2
    public MyAssistantSession(Context context) {
3
        super(context);
4
    }
5
}

Invalidando el método onHandleAssist() de la clase, puedes definir el comportamiento de tu asistente. Por ahora, hagamos que pase la cadena JSON-LD que generamos en el paso anterior y mostremos sus contenidos como un mensaje Toast. Como habrás adivinado, para regresar la cadena JSON-LD, debes usar el método getStructureData() del objeto AssistContent.

El siguiente código te muestra cómo mostrar el valor de la llave description de la cadena JSON-LD como un mensaje Toast.

1
@Override
2
public void onHandleAssist(Bundle data, 
3
              AssistStructure structure, AssistContent content) {
4
    super.onHandleAssist(data, structure, content);
5
6
    try {
7
        // Fetch structured data

8
        JSONObject structuredData = 
9
            new JSONObject(content.getStructuredData());
10
        
11
        // Display description as Toast

12
        Toast.makeText(
13
            getContext(), 
14
            structuredData.optString("description"),
15
            Toast.LENGTH_LONG
16
        ).show();
17
    } catch (JSONException e) {
18
        e.printStackTrace();
19
    }
20
21
}

Un objeto VoiceInteractionSession debe ser inicializado dentro de un objeto VoiceInteractionSessionService. Así pues, crea una nueva clase llamada MyAssistantSessionService y hazla una subclase de VoiceInteractionSessionService. Dentro de su método onNewSession(), llama al constructor de MyAssistantSession.

1
public class MyAssistantSessionService 
2
                extends VoiceInteractionSessionService {
3
    @Override
4
    public VoiceInteractionSession onNewSession(Bundle bundle) {
5
        return new MyAssistantSession(this);
6
    }
7
}

Nuestro asistente también necesita un objeto VoiceInteractionService. De ahí, crea uno llamado MyAssistantService. No tienes que escribir ningún código dentro del el.

1
public class MyAssistantService extends VoiceInteractionService {
2
3
}

Para especificar los detalles de configuración del asistente, debes crear un archivo de metadatos XML y colocarlo en el folder res/xml de tu proyecto. El elemento raíz del archivo debe ser una etiqueta <voice-interaction-service>  especificando los nombres completamente calificados en las subclases VoiceInteractionServiceVoiceInteractionSessionService.

Aquí está un archivo de metadatos de ejemplo:

1
<?xml version="1.0" encoding="utf-8"?>
2
<voice-interaction-service 
3
    xmlns:android="http://schemas.android.com/apk/res/android"
4
    android:sessionService="com.tutsplus.myassistantapp.MyAssistantSessionService"
5
    android:recognitionService="com.tutsplus.myassistantapp.MyAssistantService"
6
    android:supportsAssist="true"
7
/>

Por último, mientras declaras los servicios en el archivo AndroidManifest.xml de tu proyecto, asegúrate de que requieren el permiso BIND_VOICE_INTERACTION.

1
<service android:name=".MyAssistantService"
2
    android:permission="android.permission.BIND_VOICE_INTERACTION">
3
  <meta-data android:name="android.voice_interaction"
4
    android:resource="@xml/assist_metadata" />
5
  <intent-filter>
6
    <action android:name="android.service.voice.VoiceInteractionService"/>
7
  </intent-filter>
8
</service>
9
10
<service android:name=".MyAssistantSessionService"
11
    android:permission="android.permission.BIND_VOICE_INTERACTION">
12
</service>

Tu asistente personalizado ahora está listo.

4. Usando el Asistente Personalizado

Para poder usar tu asistente personalizado, debes establecerlo como el asistente por defecto de tu dispositivo Android. Así pues, abre la aplicación de Ajustes y navega a Aplicaciones > Aplicaciones por Defecto > Asistente y entrada de voz. Ahora, da clic en la opción Aplicación Asistente para seleccionar tu asistente.

Choosing a custom assistantChoosing a custom assistantChoosing a custom assistant

En este punto, si ejecutas tu aplicación y presionas largamente el botón de inicio, deberías poder ver el mensaje Toast de tu asistente personalizado.

Toast from custom assistantToast from custom assistantToast from custom assistant

Conclusión

En este consejo rápido, aprendiste cómo usar la API Assist para interactuar con asistentes en la plataforma Android. También aprendiste cómo crear un rudimentario asistente personalizado. Pero una advertencia: debido a que los asistentes pueden leer casi todo el texto que está presente en la pantalla de un usuario, asegúrate de que tu asistente personalizado maneja información sensible de manera segura.

Para aprender más sobre la API Assist, haz referencia a su documentación oficial. Y para aprender más sobre código y APIs de última generación para la plataforma Android, ¡revisa algunos de nuestros otros cursos y tutoriales aquí en Envato Tuts+!