Cómo optimizar el contenido contextual del Asistente

Android 6.0 Marshmallow presenta una nueva manera para que los usuarios interactúen con las apps a través del Asistente, que se muestra en una ventana de nivel superior que los usuarios pueden ver para obtener acciones relevantes según el contexto de la actividad de ese momento. 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. Como respuesta, el sistema abre una ventana de nivel superior que muestra acciones relevantes según el contexto.

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

Esta guía explica cómo las apps de Android usan esa API para mejorar la experiencia del usuario con el Asistente. Si quieres obtener información sobre cómo crear una app multimedia para que el usuario pueda iniciar el Asistente y controlarlo, consulta Apps multimedia y del Asistente de Google.

Cómo usar el Asistente

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 muestra la ventana superpuesta (pasos 2 y 3) y, luego, el usuario elige la acción que va a 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 del Asistente con la función Now on Tap de Google app

Los usuarios pueden configurar el Asistente seleccionando 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 y a una captura de pantalla, según 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. Esta sección describe cómo brindar información adicional para ayudar a mejorar la experiencia del usuario con el Asistente, además de situaciones que requieren un manejo especial, como las vistas personalizadas.

Cómo compartir información adicional con el Asistente

Además de texto y capturas de pantalla, tu app puede compartir otros datos con el Asistente. Por ejemplo, tu app de música puede elegir transferir información sobre el álbum actual para que el Asistente pueda sugerir acciones más inteligentes según la actividad actual. Ten en cuenta que las API de Assist no brindan control de contenido multimedia. Para agregar este tipo de control, consulta Apps multimedia y del Asistente de Google.

Para proporcionar información al Asistente, tu app brinda el contexto de aplicación global (registrando un receptor de app) y suministra datos específicos de 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 brindar un contexto de aplicación global, la app crea una implementación de Application.OnProvideAssistDataListener y la registra utilizando registerOnProvideAssistDataListener(). Para proporcionar información contextual específica de la actividad, se anulan 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. Debido a que las devoluciones de llamada se ejecutan en el subproceso principal, se deben completar de inmediato. Las devoluciones de llamada se invocan solamente cuando se está ejecutando la actividad.

Cómo proporcionar contexto

Cuando el usuario activa el Asistente, se invoca a onProvideAssistData() para crear 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 incluir lo que quieras en el conjunto 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 proporcionando 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 un álbum que el usuario está escuchando:

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 posible que las apps que usan una implementación de selección de texto personalizado deban implementar onProvideAssistContent() y llamar a setClipData().

Implementación predeterminada

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

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

Cómo excluir vistas del Asistente

Para administrar información confidencial, tu app puede excluir la vista del Asistente del momento configurando el parámetro de diseño FLAG_SECURE de WindowManager. Debes configurar FLAG_SECURE de manera explícita para cada ventana creada por la actividad, incluidos los diálogos. Tu app también puede usar setSecure() para excluir una superficie 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 todavía puede brindar información explícita al Asistente usando las devoluciones de llamada que se describieron anteriormente 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 en el perfil de trabajo usando 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

El Asistente usa una ventana superpuesta superficial que se muestra por encima de la actividad del momento. Como el usuario puede activar el Asistente en cualquier momento, no crees una ventana de alerta del sistema permanente que interfiera con 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, el Asistente aprovecha los vínculos directos para encontrar las apps de destino. Para hacer que tu app sea una potencial app de destino, considera admitir vínculos directos. La coincidencia entre el contexto de usuario y los vínculos directos u otras actividades potenciales que se muestran en la ventana superpuesta (como se aprecia en el paso 3 de la Figura 1) es específica de la implementación del Asistente. Por ejemplo, Google app usa el vínculo directo y Firebase App Indexing a fin de aumentar el tráfico a las apps de destino.

Cómo implementar tu propio Asistente

Es posible que quieras implementar tu propio Asistente. Tal como se muestra en la Figura 2, el usuario puede seleccionar la app del asistente que estará 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. De esta forma, el asistente puede recibir el texto y la jerarquía de vistas representados como una instancia de AssistStructure en onHandleAssist(). Recibe la captura de pantalla mediante onHandleScreenshot().