Mulai 27 Maret 2025, sebaiknya gunakan android-latest-release
, bukan aosp-main
, untuk mem-build dan berkontribusi pada AOSP. Untuk mengetahui informasi selengkapnya, lihat Perubahan pada AOSP.
Mengonfigurasi host AppCard
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Gunakan AppCardHost
untuk berkomunikasi dengan aplikasi yang menampilkan AppCards.
Izin
Setiap aplikasi yang menggunakan AppCardHost
harus memiliki izin berikut:
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- (Khusus di API level 34 dan yang lebih tinggi)
android.car.permission.BIND_APP_CARD_PROVIDER
Lakukan inisialisasi
Untuk melakukan inisialisasi host, berikan:
- Konteks
updateRate
Rasio pembaruan Kartu Aplikasi dalam milidetik.
fastUpdateRate
Kecepatan update dalam milidetik untuk komponen yang diberi tag dengan
EnforceFastUpdateRate
responseExecutor
Thread tempat Anda ingin menerima respons dari
aplikasi AppCard.
Desain
AppCardHost
dapat berinteraksi dengan salah satu dari dua cara berikut:
ATAU,
AppCardListener
Komponen AppCardListener
mendaftarkan dirinya sendiri dengan AppCardHost
untuk menerima update komunikasi dari aplikasi AppCardHost
dan AppCard.
Fungsi antarmuka AppCardListener
dijelaskan di sini.
fun onAppCardReceived(AppCardContainer)
Fungsi ini dipicu saat AppCard telah diterima dari
aplikasi. Fungsi ini dikirim sebagai AppCardContainer
yang menyediakan AppCard dan
appIdentifier
untuk mengidentifikasi aplikasi yang mengirim AppCard
fun onComponentReceived(AppCardComponentContainer)
Fungsi ini dipicu saat komponen AppCard diterima dari
aplikasi. Fungsi ini dikirim sebagai AppCardComponentContainer
, yang menyediakan
komponen AppCard, Identifier
untuk mengidentifikasi aplikasi yang mengirim
AppCard, dan ID string untuk mengarah ke AppCard yang terkait dengan komponen tersebut.
fun onProviderRemoved(String, String?)
Fungsi ini dipicu saat penyedia AppCard telah dihapus atau
dinonaktifkan. Gunakan metode ini untuk membersihkan AppCard aktif yang terkait dengan nama
paket dan otoritas penyedia yang diberikan.
Jika otorisasi adalah {@code null}
, seluruh paket akan dihapus.
fun onProviderAdded(String, String?)
Fungsi ini dipicu saat penyedia AppCard telah ditambahkan atau
diaktifkan.
Contoh penggunaan. Gunakan fungsi ini sebagai pemicu untuk memuat ulang semua AppCard
yang tersedia di pemilih AppCard. Jika otorisasi adalah {@code null}
, seluruh
paket akan ditambahkan.
fun onPackageCommunicationError(appIdentifier, Throwable)
Fungsi ini dipicu saat AppCardHost
mengalami error saat
berkomunikasi dengan penyedia AppCard.
Contoh penggunaan. Gunakan metode ini untuk menunjukkan kepada pengguna bahwa AppCard yang telah mereka
pilih mengalami error.
API
fun refreshCompatibleapp()
Metode ini harus dipanggil setiap kali aktivitas yang menggunakan host
dilanjutkan sehingga host dapat memuat ulang daftar aplikasi yang mendukung AppCard.
fun destroy()
Panggil metode ini saat aktivitas yang menggunakan host dihancurkan
sehingga host dapat membersihkan semua koneksi dan anggota internal.
fun registerListener(AppCardListener)
Digunakan untuk mendaftarkan AppCardListener
.
fun unregisterListener(AppCardListener)
Digunakan untuk membatalkan pendaftaran AppCardListener
.
fun getAllAppCards(AppCardContext)
Panggil metode ini untuk menyediakan AppCardListener
terdaftar dengan semua
AppCard yang disediakan dalam sistem dengan AppCardContext
tertentu yang
memberikan petunjuk kepada penyedia tentang cara menyusun AppCard mereka.
fun requestAppCard(AppCardContext, appIdentifier, String)
Panggil metode ini untuk menyediakan AppCardListener
terdaftar dengan
AppCard tertentu, dengan AppCardContext
yang memberikan petunjuk kepada penyedia
cara menyusun AppCard mereka.
fun notifyAppCardRemoved(appIdentifier, String)
Memberi tahu penyedia Kartu Aplikasi bahwa Kartu Aplikasinya tidak lagi aktif.
fun notifyAppCardInteraction(appIdentifier, String, String, String)
Memberi tahu penyedia AppCard bahwa AppCard-nya telah berinteraksi.
Satu-satunya interaksi yang didukung adalah klik tombol, yang ditunjukkan dengan
AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
.
Sebaiknya buat tombol untuk AppCard dengan pemroses onClick
yang memanggil fungsi ini dengan appIdentifier
, ID AppCard, ID
komponen, dan ID interaksi.
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
Kirim update AppCardContext
untuk AppCard tertentu. Misalnya, saat
beralih dari mode Parkir ke mode Mengemudi, gunakan metode ini untuk mengirim
update AppCardContext
dengan isInteractable
ditetapkan ke false
untuk setiap
AppCard yang aktif.
FAQ
Di mana saya dapat menemukan contoh penerapan?
Contoh host. Menampilkan semua AppCard yang tersedia di sistem, beserta
kemampuan pengujian.
DriverUI dan Pengelola Pano. Pengelola Pano bertindak sebagai pemilih, sedangkan
DriverUI bertindak sebagai presenter.
Berapa banyak AppCard yang dapat didukung setiap AppCardContentProvider
?
AppCardContentProvider
dapat mendukung AppCard dalam jumlah yang tidak terbatas.
Namun, pastikan untuk menyeimbangkan jumlah AppCard dengan performa yang menurun
versus pengalaman pengguna yang positif.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-06-26 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 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."]]