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 con registerOnProvideAssistDataListener()
.
Para dar 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 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 la actividad se está ejecutando.
Cómo proporcionar contexto
Cuando el usuario activa el Asistente, se llama a onProvideAssistData()
para crear un intent ACTION_ASSIST
completo con todo el contexto de la aplicación actual que se representa 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 proporcionar referencias relacionadas con el contenido y la actividad actual, y así mejorar la experiencia del usuario con el Asistente. Puedes usar vocabulario común definido por Schema.org mediante un objeto JSON-LD para describir el contenido de la app. 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:
- Ajusta el intent de contenido proporcionado para que refleje mejor el contenido de nivel superior de la actividad.
- Proporciona el URI del contenido que se muestra.
- Completa
setClipData()
con contenido adicional de interés que el usuario está viendo en ese momento.
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 igual procederá y pasará 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 la información de jerarquía de vistas y de texto. Si tu vista implementa dibujos de texto personalizado, anula onProvideStructure()
y llama a setText(CharSequence)
para proporcionar al Asistente el texto que se muestra al usuario.
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 con accesibilidad, consulta las prácticas recomendadas de creación de aplicaciones accesibles, como las siguientes:
- Proporciona los atributos
android:contentDescription
. - Propaga
AccessibilityNodeInfo
para vistas personalizadas. - Asegúrate de que los objetos
ViewGroup
personalizados expongan correctamente sus elementos secundarios.
Cómo excluir vistas del Asistente
Para controlar la información sensible, tu app puede excluir la vista actual del Asistente configurando el parámetro de diseño FLAG_SECURE
del WindowManager
. Debes establecer 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 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 del Asistente. La actividad que usa FLAG_SECURE
aún puede brindar información explícita al 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 en 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
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 vínculos directos y Firebase App Indexing para aumentar 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 activa del Asistente. 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 que se representan como una instancia de AssistStructure
en onHandleAssist()
.
Recibe la captura de pantalla a través de onHandleScreenshot()
.