Cómo optimizar el contenido contextual del Asistente

Android 6.0 Marshmallow presenta una nueva forma para que los usuarios interactúen con las apps a través de apps de asistente, como Asistente de Google. El asistente es una ventana de nivel superior que los usuarios pueden ver para obtener acciones relevantes según el contexto para la actividad actual. Estas acciones pueden incluir vínculos directos a otras apps en el dispositivo.

Los usuarios pueden activar el Asistente manteniendo presionado el botón de inicio o diciendo una frase clave. En respuesta, el sistema abre una ventana de nivel superior que muestra acciones relevantes según el contexto.

Una app de Asistente, como Asistente de Google, implementa la ventana superpuesta del Asistente mediante una función llamada Now on Tap, que funciona con la funcionalidad de Android a nivel de la plataforma. El sistema le permite al usuario seleccionar una app de Asistente, que obtiene información contextual de tu app mediante la API de Assist para Android.

En esta guía, se explica cómo las apps para Android usan la API de Assist para mejorar la experiencia del usuario con el Asistente. Si quieres obtener información para crear una app de música para que el Asistente pueda iniciarlo y controlarlo, consulta Asistente de Google y las apps de música.

Cómo usar los Asistentes

En la Figura 1 se ilustra una interacción típica entre el usuario y el Asistente. Cuando el usuario mantiene presionado el botón de inicio, se invocan las devoluciones de llamada de la API de Assist en la app de origen (paso 1). El Asistente procesa la ventana superpuesta (pasos 2 y 3) y, luego, el usuario selecciona la acción que desea realizar. El Asistente ejecuta la acción seleccionada, como activar un intent con un vínculo directo a la app del restaurante (destino) (paso 4).

Figura 1: Ejemplo de interacción con el Asistente con la función Now on Tap de Google app

Para configurar el Asistente, los usuarios deben seleccionar Configuración > Apps > Apps predeterminadas > Asistencia y entrada de voz. Los usuarios pueden cambiar las opciones del sistema, como acceder al contenido de la pantalla como texto o a una captura de pantalla, como se muestra en la Figura 2.

Figura 2: Configuración de asistencia y entrada de voz

App de origen

Para asegurarte de que tu app funcione con el Asistente como fuente de información para el usuario, solo debes seguir las prácticas recomendadas de accesibilidad. En esta sección, se describe cómo proporcionar información adicional para ayudar a mejorar la experiencia del usuario con el Asistente, además de situaciones que necesitan un control especial, como las vistas personalizadas.

Cómo compartir información adicional con el Asistente

Además del texto y la captura de pantalla, tu app puede compartir otros datos con Asistente. Por ejemplo, tu app de música puede elegir pasar información del álbum actual para que el Asistente pueda sugerir acciones más inteligentes adaptadas a la actividad actual. Ten en cuenta que las APIs de Assist no proporcionan controles multimedia. Para agregar controles multimedia, consulta Asistente de Google y apps de música.

Para brindar información adicional al Asistente, tu app brinda el contexto de aplicación global (registrando un objeto de escucha de la app) y suministrando información específica de la actividad con devoluciones de llamada de actividad, como se muestra en la Figura 3:

Figura 3: Diagrama de la secuencia del ciclo de vida de la API de Assist

Para proporcionar un contexto de aplicación global, la app crea una implementación de Application.OnProvideAssistDataListener y la registra con registerOnProvideAssistDataListener(). Para proporcionar información contextual específica, la actividad anula onProvideAssistData() y onProvideAssistContent(). Se llama a los dos métodos de actividad después de haber invocado a la devolución de llamada global opcional. Como las devoluciones de llamada se ejecutan en el subproceso principal, se deben completar de inmediato. Las devoluciones de llamada se invocan solamente cuando la actividad se está ejecutando.

Proporcionar contexto

Cuando el usuario activa el Asistente, se llama a onProvideAssistData() para compilar un intent ACTION_ASSIST completo con todo el contexto de la aplicación actual representada como una instancia de AssistStructure. Puedes anular este método para colocar lo que desees en el paquete a fin de que aparezca en la parte EXTRA_ASSIST_CONTEXT del intent del asistente.

Cómo describir contenido

Tu app puede implementar onProvideAssistContent() para mejorar la experiencia del usuario con el Asistente al proporcionar referencias relacionadas con el contenido y la actividad actual. Puedes describir el contenido de la app usando vocabulario común definido por Schema.org mediante un objeto JSON-LD. En el siguiente ejemplo, una app de música proporciona datos estructurados para describir el álbum de música que el usuario está viendo en ese momento:

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

Java

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

También puedes mejorar la experiencia del usuario con implementaciones personalizadas de onProvideAssistContent(), que pueden brindar los siguientes beneficios:

Nota: Es probable que las apps que usan una implementación de selección de texto personalizada deban implementar onProvideAssistContent() y llamar a setClipData().

Implementación predeterminada

Si no se implementan las devoluciones de llamada onProvideAssistData() ni onProvideAssistContent(), el sistema continúa y pasa la información recopilada automáticamente al Asistente, a menos que la ventana actual esté marcada como segura. Como se muestra en la figura 3, el sistema usa las implementaciones predeterminadas de onProvideStructure() y onProvideVirtualStructure() para recopilar información de jerarquía de vistas y texto. Si tu vista implementa dibujos de texto personalizado, anula onProvideStructure() para proporcionar al Asistente el texto que se muestra al usuario llamando a setText(CharSequence).

En la mayoría de los casos, implementar la compatibilidad de accesibilidad permite que el Asistente obtenga la información que necesita. Para implementar la compatibilidad de accesibilidad, consulta las prácticas recomendadas que se describen en Cómo generar accesibilidad a las aplicaciones, incluidas las siguientes:

Cómo excluir vistas de los asistentes

Para controlar información sensible, tu app puede excluir la vista actual del Asistente configurando el parámetro de diseño FLAG_SECURE de WindowManager. Debes configurar FLAG_SECURE de manera explícita para cada ventana que crea la actividad, incluidos los diálogos. Tu app también puede usar setSecure() para excluir una plataforma del Asistente. No existe un mecanismo global (a nivel de la app) para excluir todas las vistas del Asistente. Ten en cuenta que FLAG_SECURE no hace que dejen de activarse las devoluciones de llamada de la API de Assist. La actividad que usa FLAG_SECURE aún puede proporcionar información explícitamente a una app de Asistente mediante las devoluciones de llamada que se describieron antes en esta guía.

Nota: En el caso de las cuentas empresariales (Android for Work), el administrador puede inhabilitar la recopilación de datos del Asistente para el perfil de trabajo con el método setScreenCaptureDisabled() de la API de DevicePolicyManager.

Interacciones de voz

Las devoluciones de llamada de la API de Assist también se invocan a partir de la detección de la frase clave. Para obtener más información, consulta la documentación de Acciones de voz.

Consideraciones del orden Z

Un asistente usa una ventana superpuesta superficial que se muestra sobre la actividad actual. Debido a que el usuario puede activar el Asistente en cualquier momento, no crees ventanas permanentes de alerta del sistema que interfieran en la ventana superpuesta, como se muestra en la Figura 4.

Figura 4: Capa de orden Z del Asistente

Si tu app usa ventanas de alerta del sistema, quítalas de inmediato, porque si las dejas en la pantalla, perjudican la experiencia del usuario.

App de destino

Por lo general, las apps de Asistente aprovechan los vínculos directos para encontrar apps de destino. Para hacer que tu app sea una potencial app de destino, considera admitir vínculos directos. La coincidencia entre el contexto del usuario actual y los vínculos directos, o bien otras acciones potenciales que se muestran en la ventana superpuesta (que se muestra en el paso 3 de la Figura 1), es específica de la implementación de Asistente de Google. Por ejemplo, la app del Asistente de Google usa vínculos directos y vínculos de apps para dirigir el tráfico a las apps de destino.

Cómo implementar tu propio Asistente

Es posible que quieras implementar tu propio Asistente. Como se muestra en la Figura 2, el usuario puede seleccionar la app del Asistente activa. Esta debe proporcionar una implementación de VoiceInteractionSessionService y VoiceInteractionSession, como se muestra en este ejemplo de VoiceInteraction. También requiere el permiso BIND_VOICE_INTERACTION. Luego, el Asistente puede recibir el texto y la jerarquía de vistas representada como una instancia de AssistStructure en onHandleAssist(). Recibe la captura de pantalla a través de onHandleScreenshot().