Od 27 marca 2025 r. zalecamy używanie android-latest-release
zamiast aosp-main
do kompilowania i wspołtworzenia AOSP. Więcej informacji znajdziesz w artykule o zmianach w AOSP.
Konfigurowanie hosta karty aplikacji
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Użyj AppCardHost
, aby komunikować się z aplikacjami, które wyświetlają karty aplikacji.
Uprawnienia
Aplikacja, która korzysta z uprawnienia AppCardHost
, musi mieć te uprawnienia:
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- (tylko w poziomie API 34 lub nowszym)
android.car.permission.BIND_APP_CARD_PROVIDER
Zainicjuj
Aby zainicjować hosta, podaj:
- Kontekst
updateRate
Częstotliwość aktualizacji karty aplikacji (w milisekundach).
fastUpdateRate
Częstotliwość aktualizacji w milisekundach w przypadku komponentów oznaczonych etykietą EnforceFastUpdateRate
responseExecutor
Wątek, w którym chcesz otrzymywać odpowiedzi z aplikacji AppCard.
Projektowanie
Z elementem AppCardHost
można wchodzić w interakcję na 2 sposoby:
LUB
AppCardListener
Komponent AppCardListener
rejestruje się w usługach AppCardHost
, aby otrzymywać powiadomienia z aplikacji AppCardHost
i AppCard.
Tutaj znajdziesz szczegółowe informacje o funkcjach interfejsu AppCardListener
.
fun onAppCardReceived(AppCardContainer)
Ta funkcja jest wywoływana po otrzymaniu karty aplikacji z aplikacji. Jest ona wysyłana jako AppCardContainer
, który zawiera kartę aplikacji i appIdentifier
, aby zidentyfikować aplikację, która wysłała kartę aplikacji
fun onComponentReceived(AppCardComponentContainer)
Ta funkcja jest wywoływana po otrzymaniu od aplikacji komponentu karty aplikacji. Jest on wysyłany jako AppCardComponentContainer
, który zawiera komponent karty aplikacji, Identifier
, aby zidentyfikować aplikację, która wysłała kartę aplikacji, oraz identyfikator ciągu znaków wskazujący kartę aplikacji, z którą jest powiązany komponent.
fun onProviderRemoved(String, String?)
Ta funkcja jest uruchamiany, gdy dostawca kart aplikacji został usunięty lub wyłączony. Użyj tej metody, aby usunąć wszystkie aktywne karty aplikacji powiązane z danym imieniem pakietu i uprawnieniami dostawcy.
Jeśli autorytet to {@code null}
, oznacza to, że usunięto cały pakiet.
fun onProviderAdded(String, String?)
Ta funkcja jest wywoływana po dodaniu lub włączeniu dostawcy kart AppCard.
Przykładowe zastosowanie Użyj tej funkcji jako elementu wyzwalającego, aby odświeżyć wszystkie dostępne karty aplikacji w selektorze kart aplikacji. Jeśli autorytet to {@code null}
, oznacza to, że dodano cały pakiet.
fun onPackageCommunicationError(appIdentifier, Throwable)
Ta funkcja jest wywoływana, gdy AppCardHost
napotka błąd podczas komunikacji z dostawcą kart AppCard.
Przykładowe zastosowanie Użyj tej metody, aby poinformować użytkownika, że wybrana przez niego karta aplikacji napotkała błąd.
Interfejsy API
fun refreshCompatibleapp()
Należy ją wywołać, gdy wznowiona zostanie aktywność korzystająca z hosta, aby host mógł odświeżyć listę aplikacji obsługujących karty aplikacji.
fun destroy()
Wywołuj tę metodę, gdy aktywność, która używa hosta, zostanie zniszczona, aby host mógł usunąć wszystkie połączenia i wewnętrzne elementy.
fun registerListener(AppCardListener)
Używana do rejestracji AppCardListener
.
fun unregisterListener(AppCardListener)
Używany do wyrejestrowania AppCardListener
.
fun getAllAppCards(AppCardContext)
Wywołaj tę metodę, aby podać zarejestrowanemu AppCardListener
wszystkie karty AppCard udostępnione w systemie z danym AppCardContext
, co daje dostawcom wskazówki dotyczące struktury karty AppCard.
fun requestAppCard(AppCardContext, appIdentifier, String)
Wywołaj tę metodę, aby podać zarejestrowanemu AppCardListener
konkretną kartę aplikacji, podając AppCardContext
, która zawiera wskazówki dla dostawców dotyczące struktury karty aplikacji.
fun notifyAppCardRemoved(appIdentifier, String)
Poinformuj dostawcę karty AppCard, że karta nie jest już aktywna.
fun notifyAppCardInteraction(appIdentifier, String, String, String)
Powiadomienie dostawcy karty AppCard o jej kliknięciu.
Jedyną obsługiwaną interakcją jest kliknięcie przycisku, które jest sygnalizowane przez ikonęAppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
.
Zalecamy utworzenie przycisku karty aplikacji z odbiorcą onClick
, który wywołuje tę funkcję z użyciem appIdentifier
, identyfikatora karty aplikacji, identyfikatora komponentu i identyfikatora interakcji.
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
Wyślij aktualizację AppCardContext
określonej karty aplikacji. Na przykład podczas przechodzenia z trybu Parkowanie do trybu Jazda możesz użyć tej metody, aby wysłać aktualizację AppCardContext
, w której wartość parametru isInteractable
dla każdej aktywnej karty aplikacji jest ustawiona na false
.
Najczęstsze pytania
Gdzie mogę znaleźć przykładowe implementacje?
Przykładowy gospodarz Wyświetla wszystkie dostępne w systemie karty aplikacji wraz z możliwościami testowania.
DriverUI i Menedżer panoram. Menedżer panoramy działa jako selektor, a DriverUI jako prezenter.
Ile kart aplikacji może obsługiwać każda AppCardContentProvider
?
AppCardContentProvider
może obsługiwać nieskończoną liczbę kart aplikacji.
Pamiętaj jednak, aby zachować równowagę między liczbą kart aplikacji a ich wydajnością oraz wrażeniami użytkowników.
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-06-26 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 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."]]