À partir du 27 mars 2025, nous vous recommandons d'utiliser android-latest-release
au lieu de aosp-main
pour créer et contribuer à AOSP. Pour en savoir plus, consultez la section Modifications apportées à AOSP.
Configurer un hôte d'AppCard
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Utilisez AppCardHost
pour communiquer avec les applications qui affichent des fiches d'application.
Autorisations
Toute application qui utilise un AppCardHost
doit disposer des autorisations suivantes :
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- (uniquement au niveau d'API 34 ou version ultérieure)
android.car.permission.BIND_APP_CARD_PROVIDER
Initialiser
Pour initialiser l'hôte, fournissez les éléments suivants :
- Contexte
updateRate
Fréquence de mise à jour de la fiche d'application en millisecondes.
fastUpdateRate
Fréquence de mise à jour en millisecondes pour les composants tagués avec EnforceFastUpdateRate
responseExecutor
Fil de discussion sur lequel vous souhaitez recevoir des réponses des applications AppCard.
Conception
Vous pouvez interagir avec un AppCardHost
de deux manières :
OU,
AppCardListener
Le composant AppCardListener
s'enregistre auprès d'un AppCardHost
pour recevoir des informations de communication provenant des applications AppCardHost
et AppCard.
Les fonctions d'interface d'un AppCardListener
sont détaillées ici.
fun onAppCardReceived(AppCardContainer)
Cette fonction est déclenchée lorsqu'une fiche d'application a été reçue à partir d'une application. Elle est envoyée en tant que AppCardContainer
, qui fournit une fiche d'application et un appIdentifier
pour identifier l'application qui a envoyé la fiche d'application.
fun onComponentReceived(AppCardComponentContainer)
Cette fonction se déclenche lorsqu'un composant AppCard est reçu à partir d'une application. Il est envoyé en tant que AppCardComponentContainer
, qui fournit un composant AppCards, Identifier
pour identifier l'application qui a envoyé l'AppCard, et un ID de chaîne pour pointer vers l'AppCard à laquelle le composant est associé.
fun onProviderRemoved(String, String?)
Cette fonction est déclenchée lorsqu'un fournisseur de cartes d'application a été supprimé ou désactivé. Utilisez cette méthode pour nettoyer toute fiche d'application active associée au nom de package et à l'autorité du fournisseur donnés.
Si l'autorité est {@code null}
, un package entier a été supprimé.
fun onProviderAdded(String, String?)
Cette fonction se déclenche lorsqu'un fournisseur de cartes d'application a été ajouté ou activé.
Exemple d'utilisation Utilisez cette fonction comme déclencheur pour actualiser toutes les cartes d'application disponibles dans un sélecteur de cartes d'application. Si l'autorité est {@code null}
, un package entier a été ajouté.
fun onPackageCommunicationError(appIdentifier, Throwable)
Cette fonction est déclenchée lorsque AppCardHost
rencontre une erreur lors de la communication avec un fournisseur d'AppCard.
Exemple d'utilisation Utilisez cette méthode pour indiquer à l'utilisateur qu'une fiche d'application qu'il a sélectionnée a rencontré une erreur.
API
fun refreshCompatibleapp()
Cette méthode doit être appelée chaque fois que l'activité qui utilise l'hôte est reprise afin que l'hôte puisse actualiser sa liste d'applications compatibles avec les fiches d'application.
fun destroy()
Appelez cette méthode lorsqu'une activité qui utilise un hôte est détruite afin que l'hôte puisse nettoyer toutes les connexions et les membres internes.
fun registerListener(AppCardListener)
Permet d'enregistrer un AppCardListener
.
fun unregisterListener(AppCardListener)
Permet de désenregistrer un AppCardListener
.
fun getAllAppCards(AppCardContext)
Appelez cette méthode pour fournir à un AppCardListener
enregistré toutes les AppCards fournies dans le système avec un AppCardContext
donné qui fournit des conseils aux fournisseurs sur la façon de structurer leur AppCard.
fun requestAppCard(AppCardContext, appIdentifier, String)
Appelez cette méthode pour fournir à un AppCardListener
enregistré une fiche d'application spécifique, en fonction d'une AppCardContext
qui donne des indications aux fournisseurs sur la façon de structurer leur fiche d'application.
fun notifyAppCardRemoved(appIdentifier, String)
Avertir un fournisseur d'App Card que son App Card n'est plus active
fun notifyAppCardInteraction(appIdentifier, String, String, String)
Notifier un fournisseur d'AppCard que son AppCard a été utilisée.
La seule interaction acceptée est un clic sur un bouton, indiqué par un AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
.
Nous vous recommandons de créer un bouton pour une fiche d'application avec un écouteur onClick
qui appelle cette fonction avec appIdentifier
, l'ID de la fiche d'application, l'ID du composant et l'ID d'interaction.
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
Envoyez une mise à jour AppCardContext
pour une fiche d'application spécifique. Par exemple, lorsque vous passez du mode "Park" (Stationnement) au mode "Drive" (Conduite), utilisez cette méthode pour envoyer une mise à jour AppCardContext
dans laquelle isInteractable
est défini sur false
pour chaque carte d'application active.
Questions fréquentes
Où puis-je trouver des exemples d'implémentations ?
Exemple d'hôte Affiche toutes les fiches d'application disponibles dans le système, ainsi que les fonctionnalités de test.
DriverUI et le gestionnaire Pano Le gestionnaire Pano agit en tant que sélecteur, tandis que DriverUI agit en tant que présentateur.
Combien d'AppCards chaque AppCardContentProvider
peut-il prendre en charge ?
Un AppCardContentProvider
peut prendre en charge un nombre infini d'AppCards.
Toutefois, veillez à équilibrer le nombre d'AppCards avec les performances dégradées et une expérience utilisateur positive.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/06/26 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 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."]]