A partir de 27 de março de 2025, recomendamos usar android-latest-release
em vez de aosp-main
para criar e contribuir com o AOSP. Para mais informações, consulte Mudanças no AOSP.
Configurar um host de cartão de app
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Use AppCardHost
para se comunicar com apps que mostram cards de apps.
Permissões
Qualquer app que use uma AppCardHost
precisa ter as seguintes permissões:
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- Somente no nível 34 da API e versões mais recentes
android.car.permission.BIND_APP_CARD_PROVIDER
Initialize
Para inicializar o host, forneça:
- Contexto
updateRate
Taxa de atualização do card do app em milissegundos.
fastUpdateRate
Taxa de atualização em milissegundos para componentes marcados com
EnforceFastUpdateRate
responseExecutor
Uma conversa em que você quer receber respostas de
apps do AppCard.
Design
É possível interagir com um AppCardHost
de duas maneiras:
OU,
AppCardListener
O componente AppCardListener
se registra com um AppCardHost
para receber atualizações de comunicação dos apps AppCardHost
e AppCard.
As funções de interface de um AppCardListener
estão detalhadas aqui.
fun onAppCardReceived(AppCardContainer)
Essa função é acionada quando um AppCard é recebido de um
app. Ela é enviada como um AppCardContainer
, que fornece um AppCard e um
appIdentifier
para identificar o app que enviou o AppCard
fun onComponentReceived(AppCardComponentContainer)
Essa função é acionada quando um componente de card do app é recebido de
um app. Ela é enviada como um AppCardComponentContainer
, que fornece
um componente de card do app, Identifier
para identificar o app que enviou o
card e um ID de string para apontar para o card ao qual o componente
está relacionado.
fun onProviderRemoved(String, String?)
Essa função é acionada quando um provedor de cardápio de app é removido ou
desativado. Use esse método para limpar qualquer AppCard ativo relacionado ao nome do
pacote e à autoridade do provedor.
Se a autoridade for {@code null}
, um pacote inteiro foi removido.
fun onProviderAdded(String, String?)
Essa função é acionada quando um provedor de AppCard é adicionado ou
ativado.
Exemplo de uso. Use essa função como um acionador para atualizar todos os cards de app
disponíveis em um seletor de cards de app. Se a autoridade for {@code null}
, um pacote
inteiro foi adicionado.
fun onPackageCommunicationError(appIdentifier, Throwable)
Essa função é acionada quando o AppCardHost
encontra um erro ao
se comunicar com um provedor de cartão de app.
Exemplo de uso. Use esse método para mostrar ao usuário que um card de app
selecionado encontrou um erro.
APIs
fun refreshCompatibleapp()
Esse método precisa ser chamado sempre que a atividade que está usando o host é
retomada para que o host possa atualizar a lista de apps que oferecem suporte a cards de apps.
fun destroy()
Chamar esse método quando uma atividade que está usando um host for destruída
para que o host possa limpar todas as conexões e membros internos.
fun registerListener(AppCardListener)
Usado para registrar um AppCardListener
.
fun unregisterListener(AppCardListener)
Usado para cancelar o registro de um AppCardListener
.
fun getAllAppCards(AppCardContext)
Chamar esse método para fornecer um AppCardListener
registrado com todos
os cards de app fornecidos no sistema com um AppCardContext
específico que
oferece dicas aos provedores sobre como estruturar o card de app.
fun requestAppCard(AppCardContext, appIdentifier, String)
Chama esse método para fornecer um AppCardListener
registrado com um
AppCard específico, considerando um AppCardContext
que dá dicas aos provedores
sobre como estruturar o AppCard.
fun notifyAppCardRemoved(appIdentifier, String)
Notificar um provedor de cartão do app de que o cartão não está mais ativo.
fun notifyAppCardInteraction(appIdentifier, String, String, String)
Notificar um provedor de cartão que o cartão dele foi usado.
A única interação com suporte é um clique no botão, que é indicado por um
AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
.
Recomendamos criar um botão para um AppCard com um listener onClick
que chame essa função com appIdentifier
, o ID do AppCard, o ID do componente
e o ID da interação.
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
Envie uma atualização AppCardContext
para um card de app específico. Por exemplo, ao
mudar do modo "Estacionamento" para o modo "Direção", use esse método para enviar uma
atualização AppCardContext
em que isInteractable
é definido como false
para cada
AppCard ativo.
Perguntas frequentes
Onde posso encontrar exemplos de implementações?
Exemplo de host. Mostra todos os App Cards disponíveis no sistema, além dos
recursos de teste.
DriverUI e Gerenciador Pano. O gerenciador Pano atua como o seletor, enquanto
a DriverUI atua como o apresentador.
Com quantos AppCards cada AppCardContentProvider
pode ser usado?
Um AppCardContentProvider
pode oferecer suporte a um número infinito de cards de app.
No entanto, é importante equilibrar o número de cards de app com a performance degradada
em relação a uma experiência do usuário positiva.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-06-26 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 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."]]