A partir del 27 de marzo de 2025, te recomendamos que uses android-latest-release
en lugar de aosp-main
para compilar y contribuir a AOSP. Para obtener más información, consulta Cambios en AOSP.
Configura un host de AppCard
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Usa AppCardHost
para comunicarte con las apps que muestran tarjetas de apps.
Permisos
Cualquier app que use un AppCardHost
debe tener los siguientes permisos:
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- (solo en el nivel de API 34 y versiones posteriores)
android.car.permission.BIND_APP_CARD_PROVIDER
Inicialización
Para inicializar el host, proporciona lo siguiente:
- Contexto
updateRate
Tasa de actualización de la tarjeta de aplicación en milisegundos.
fastUpdateRate
Tasa de actualización en milisegundos para los componentes etiquetados con EnforceFastUpdateRate
responseExecutor
Es un subproceso en el que deseas recibir respuestas de las apps de AppCard.
Diseño
Se puede interactuar con un AppCardHost
de una de las siguientes maneras:
O
AppCardListener
El componente AppCardListener
se registra con un AppCardHost
para recibir actualizaciones de comunicación de las apps AppCardHost
y AppCard.
Aquí se detallan las funciones de interfaz de un AppCardListener
.
fun onAppCardReceived(AppCardContainer)
Esta función se activa cuando se recibe una tarjeta de aplicación de una app. Se envía como un AppCardContainer
que proporciona una tarjeta de aplicación y un appIdentifier
para identificar la app que envió la tarjeta de aplicación.
fun onComponentReceived(AppCardComponentContainer)
Esta función se activa cuando se recibe un componente de AppCard de una app. Se envía como un AppCardComponentContainer
, que proporciona un componente de AppCards, Identifier
, para identificar la app que envió la AppCard, y un ID de cadena para apuntar a la AppCard con la que está relacionado el componente.
fun onProviderRemoved(String, String?)
Esta función se activa cuando se quita o inhabilita un proveedor de tarjetas de aplicación. Usa este método para limpiar cualquier tarjeta de aplicación activa relacionada con el nombre del paquete y la autoridad del proveedor determinados.
Si la autoridad es {@code null}
, se quitó un paquete completo.
fun onProviderAdded(String, String?)
Esta función se activa cuando se agrega o habilita un proveedor de tarjetas de aplicación.
Ejemplo de uso. Usa esta función como activador para actualizar todas las tarjetas de aplicación disponibles en un selector de tarjetas de aplicación. Si la autoridad es {@code null}
, se agregó un paquete completo.
fun onPackageCommunicationError(appIdentifier, Throwable)
Esta función se activa cuando AppCardHost
encuentra un error cuando se comunica con un proveedor de AppCard.
Ejemplo de uso. Usa este método para mostrarle al usuario que una tarjeta de aplicación que eligió tuvo un error.
APIs
fun refreshCompatibleapp()
Se debe llamar a este método cada vez que se reanuda la actividad que usa el host para que este pueda actualizar su lista de apps que admiten tarjetas de aplicación.
fun destroy()
Llama a este método cuando se destruye una actividad que usa un host para que el host pueda limpiar todas las conexiones y los miembros internos.
fun registerListener(AppCardListener)
Se usa para registrar un AppCardListener
.
fun unregisterListener(AppCardListener)
Se usa para cancelar el registro de un AppCardListener
.
fun getAllAppCards(AppCardContext)
Llama a este método para proporcionar un AppCardListener
registrado con todas las tarjetas de aplicación proporcionadas en el sistema con un AppCardContext
determinado que les proporciona sugerencias a los proveedores sobre cómo estructurar su tarjeta de aplicación.
fun requestAppCard(AppCardContext, appIdentifier, String)
Llama a este método para proporcionar un AppCardListener
registrado con una AppCard específica, dado un AppCardContext
que les da sugerencias a los proveedores sobre cómo estructurar su AppCard.
fun notifyAppCardRemoved(appIdentifier, String)
Notificar a un proveedor de tarjetas de aplicación que su tarjeta de aplicación ya no está activa
fun notifyAppCardInteraction(appIdentifier, String, String, String)
Notifica a un proveedor de la tarjeta de aplicación que se interactuó con ella.
La única interacción admitida es un clic en el botón, que se indica con un AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
.
Te recomendamos que crees un botón para una tarjeta de aplicación con un objeto de escucha onClick
que llame a esta función con appIdentifier
, el ID de la tarjeta de aplicación, el ID del componente y el ID de interacción.
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
Envía una actualización de AppCardContext
para una AppCard específica. Por ejemplo, cuando cambies del modo de estacionamiento al modo de conducción, usa este método para enviar una actualización de AppCardContext
en la que isInteractable
se establezca en false
para cada AppCard activa.
Preguntas frecuentes
¿Dónde puedo encontrar implementaciones de ejemplo?
Host de muestra. Muestra todas las tarjetas de aplicación disponibles en el sistema, junto con las capacidades de prueba.
DriverUI y el administrador de Pano El administrador de Pano actúa como el selector, mientras que DriverUI actúa como el presentador.
¿Cuántas tarjetas de aplicación puede admitir cada AppCardContentProvider
?
Un AppCardContentProvider
puede admitir una cantidad infinita de tarjetas de aplicación.
Sin embargo, asegúrate de equilibrar la cantidad de tarjetas de aplicación con un rendimiento degradado en comparación con una experiencia del usuario positiva.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-06-26 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-06-26 (UTC)"],[],[],null,["# Configure an AppCard host\n\nUse `AppCardHost` to communicate with apps that show AppCards.\n\nPermissions\n-----------\n\nAny app that uses an `AppCardHost` must have the following permissions:\n\n- `android.permission.INTERACT_ACROSS_USERS_FULL`\n- `android.permission.QUERY_ALL_PACKAGES`\n- (In API level 34 and higher **only** ) `android.car.permission.BIND_APP_CARD_PROVIDER`\n\nInitialize\n----------\n\nTo initialize the host, provide:\n\n- Context\n- `updateRate` AppCard update rate in milliseconds.\n- `fastUpdateRate` Update rate in milliseconds for components tagged with `EnforceFastUpdateRate`\n- `responseExecutor` A thread on which you want to receive responses from AppCard apps.\n\nDesign\n------\n\nAn `AppCardHost` can be interacted with in one of two ways:\n\n- Register as an [`AppCardListener`](#appcardlistener)\n\nOR,\n\n- Interact with the [`AppCardHost` APIs](#api)\n\n### AppCardListener\n\nThe `AppCardListener` component registers itself with an `AppCardHost`\nto receive communication updates from the `AppCardHost` and AppCard apps.\nThe interface functions of an `AppCardListener` are detailed here.\n\n\u003cbr /\u003e\n\n`fun onAppCardReceived(AppCardContainer)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis function is triggered when an AppCard has been received from an app. It's sent as an `AppCardContainer` which provides an AppCard and an `appIdentifier` to identify the app that sent the AppCard\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onComponentReceived(AppCardComponentContainer)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis function is triggered when an AppCard component is received from an app. It's sent as an `AppCardComponentContainer`, which provides an AppCards component, `Identifier` to identify the app that sent the AppCard, and a string ID to point to the AppCard to which the component is related.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onProviderRemoved(String, String?)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis function is triggered when an AppCard provider has been removed or disabled. Use this method to clean up any active AppCard related to the given package name and provider authority.\u003cbr /\u003e\n\nIf authority is `{@code null}`, then an entire package was removed.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onProviderAdded(String, String?)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis function is triggered when an AppCard provider has been added or enabled.\u003cbr /\u003e\n\n**Sample usage.** Use this function as a trigger to refresh all available\nAppCards in an AppCard picker. If authority is `{@code null}`, then an entire\npackage was added.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onPackageCommunicationError(appIdentifier, Throwable)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis function is triggered when the `AppCardHost` encounters an error when communicating with an AppCard provider.\n\n\u003cbr /\u003e\n\n**Sample usage.** Use this method to show to the user that an AppCard they have\nselected has encountered an error.\n\n\u003cbr /\u003e\n\n### APIs\n\n\u003cbr /\u003e\n\n`fun refreshCompatibleapp()`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nThis method should be called whenever the activity that is using the host is resumed so that the host can refresh its list of apps that support AppCards.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun destroy()`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nCall this method when an activity that is using a host is destroyed so that the host can clean up all connections and internal members.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun registerListener(AppCardListener)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nUsed to register an `AppCardListener`.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun unregisterListener(AppCardListener)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nUsed to unregister an `AppCardListener`.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun getAllAppCards(AppCardContext)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nCall this method to supply a registered `AppCardListener` with all the AppCards provided in the system with a given `AppCardContext` that provides hints to the providers on how to structure their AppCard.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun requestAppCard(AppCardContext, appIdentifier, String)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nCall this method to supply a registered `AppCardListener` with a specific AppCard, given an `AppCardContext` that gives hints to the providers on how to structure their AppCard.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun notifyAppCardRemoved(appIdentifier, String)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nNotify an AppCard provider that its AppCard is no longer active.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun notifyAppCardInteraction(appIdentifier, String, String, String)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nNotify an AppCard provider that its AppCard has been interacted with. The only supported interaction is a button click, which is signified by a `AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK`.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nWe recommend creating a button for an AppCard with an `onClick` listener that calls this function with `appIdentifier`, AppCard ID, component ID, and interaction ID.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)`\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nSend an `AppCardContext` update for a specific AppCard. For example, when shifting from Park mode to Drive mode, use this method to send an `AppCardContext` update in which `isInteractable` is set to `false` for each active AppCard.\n\n\u003cbr /\u003e\n\nFAQ\n---\n\n1. Where can I find sample implementations?\n\n - [Sample host](https://android.googlesource.com/platform/packages/apps/Car/libs/+/refs/tags/ub-automotive-master-20250418/car-app-card-host-lib/sample-host/). Shows all available AppCards in the system, along with\n testing capabilities.\n\n - DriverUI and [Pano manager](https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/services/Car/car_product/distant_display/apps/CarDistantDisplayPanoManager/;l=1?q=CarDistantDisplayPanoManager&sq=&ss=android%2Fplatform%2Fsuperproject%2Fmain). Pano manager acts as the picker while\n DriverUI acts as the presenter.\n\n2. How many AppCards can each `AppCardContentProvider` support?\n\n An `AppCardContentProvider` can support an infinite number of AppCards.\n However, be sure to balance the number of AppCards with degraded performance\n versus a positive user experience."]]