Android 6.0 Marshmallow presenta una nueva manera para que los usuarios interactúen con apps a través de apps de Asistente, como Asistente de Google. 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. En respuesta, el sistema abre una ventana de nivel superior que muestra acciones relevantes según el contexto.
Una app del Asistente, como Asistente de Google, implementa la ventana superpuesta del Asistente a través de una función llamada Now on Tap, que trabaja con la funcionalidad a nivel de la plataforma de Android. 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.
En esta guía, se explica cómo las apps para Android usan la API de Assist de Android para mejorar la experiencia del usuario con el Asistente. Si quieres obtener información sobre cómo crear una app multimedia para que el Asistente pueda iniciarla y controlarla, consulta Asistente de Google y las apps de música.
Cómo usar 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 renderiza la ventana superpuesta (pasos 2 y 3) y, luego, el usuario selecciona 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).
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.
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 requieren 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 el Asistente. Por ejemplo, tu app de música puede elegir transferir 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 brindan control de contenido multimedia. Para agregar controles multimedia, consulta Asistente de Google y apps de música.
Para proporcionar información adicional al Asistente, tu app brinda el contexto de aplicación global (registrando un objeto de escucha de app) y suministra datos específicos de actividad con devoluciones de llamada de actividad, como se muestra en la Figura 3:
Para brindar 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 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 compilar un intent ACTION_ASSIST
completo con todo el contexto de la aplicación actual representado como una instancia de AssistStructure
. Puedes anular este método para colocar lo que desees en el paquete para que aparezca en la parte EXTRA_ASSIST_CONTEXT
del intent de asistencia.
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 describir el contenido de la app usando el vocabulario común definido por Schema.org a través de un objeto JSON-LD. En el siguiente ejemplo, una app de música proporciona datos estructurados para describir el á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 contexto 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 probable 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 onProvideAssistData()
ni onProvideAssistContent()
, de todas formas, 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 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 de accesibilidad, consulta las prácticas recomendadas que se describen en Cómo generar accesibilidad a las aplicaciones, que incluyen lo siguiente:
- 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 de los asistentes
Para controlar la información sensible, tu app puede excluir la vista actual del Asistente estableciendo 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 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
aún puede proporcionar información explícita a una app del Asistente mediante 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 para 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
Un asistente usa una ventana superpuesta ligera que se muestra sobre la actividad actual. Como el usuario puede activar el Asistente en cualquier momento, no crees ventanas permanentes de alerta del sistema que interfieran con la ventana superpuesta, como se muestra en la Figura 4.
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 las apps de destino. Para hacer que tu app sea una posible app de destino, considera admitir vínculos directos. La coincidencia entre el contexto del usuario actual y los vínculos directos u otras acciones posibles que se muestran en la ventana de superposición (que se muestra en el paso 3 de la Figura 1) es específica de la implementación del Asistente de Google. Por ejemplo, la app de Asistente de Google usa vínculos directos y vínculos de apps 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 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
. 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()
.