2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
AppCard ホストを構成する
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
AppCardHost
を使用して、アプリカードを表示するアプリと通信します。
権限
AppCardHost
を使用するアプリには、次の権限が必要です。
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.QUERY_ALL_PACKAGES
- (API レベル 34 以降のみ)
android.car.permission.BIND_APP_CARD_PROVIDER
初期化
ホストを初期化するには、次の情報が必要です。
- コンテキスト
updateRate
AppCard の更新頻度(ミリ秒単位)。
fastUpdateRate
EnforceFastUpdateRate
というタグが付けられたコンポーネントの更新レート(ミリ秒単位)
responseExecutor
AppCard アプリからレスポンスを受信するスレッド。
デザイン
AppCardHost
を操作する方法は 2 つあります。
または
AppCardListener
AppCardListener
コンポーネントは AppCardHost
に自身を登録し、AppCardHost
アプリと AppCard アプリから通信の最新情報を受け取ります。AppCardListener
のインターフェース関数の詳細については、こちらをご覧ください。
fun onAppCardReceived(AppCardContainer)
この関数は、アプリから AppCard を受信したときにトリガーされます。AppCard と AppCard を送信したアプリを識別する appIdentifier
を指定する AppCardContainer
として送信されます。
fun onComponentReceived(AppCardComponentContainer)
この関数は、アプリから AppCard コンポーネントが受信されたときにトリガーされます。AppCardComponentContainer
として送信され、AppCard コンポーネント、AppCard を送信したアプリを識別する Identifier
、コンポーネントが関連付けられている AppCard を指す文字列 ID を提供します。
fun onProviderRemoved(String, String?)
この関数は、AppCard プロバイダが削除または無効にされたときにトリガーされます。このメソッドは、指定されたパッケージ名とプロバイダの権限に関連するアクティブな AppCard をクリーンアップするために使用します。
authority が {@code null}
の場合、パッケージ全体が削除されています。
fun onProviderAdded(String, String?)
この関数は、AppCard プロバイダが追加または有効にされたときにトリガーされます。
使用例: この関数は、AppCard 選択ツールで利用可能なすべての AppCard を更新するトリガーとして使用します。authority が {@code null}
の場合、パッケージ全体が追加されています。
fun onPackageCommunicationError(appIdentifier, Throwable)
この関数は、AppCardHost
が AppCard プロバイダとの通信中にエラーに遭遇したときにトリガーされます。
使用例: このメソッドは、選択した AppCard でエラーが発生したことをユーザーに示すために使用します。
API
fun refreshCompatibleapp()
ホストを使用しているアクティビティが再開されるたびに、このメソッドを呼び出して、ホストが AppCard をサポートするアプリのリストを更新できるようにする必要があります。
fun destroy()
ホストを使用しているアクティビティが破棄されたときに、このメソッドを呼び出して、ホストがすべての接続と内部メンバーをクリーンアップできるようにします。
fun registerListener(AppCardListener)
AppCardListener
の登録に使用されます。
fun unregisterListener(AppCardListener)
AppCardListener
の登録解除に使用。
fun getAllAppCards(AppCardContext)
このメソッドを呼び出して、登録済みの AppCardListener
に、システムで提供されるすべての AppCard と、AppCard の構造化方法に関するヒントを提供する特定の AppCardContext
を指定します。
fun requestAppCard(AppCardContext, appIdentifier, String)
このメソッドを呼び出して、登録済みの AppCardListener
に特定の AppCard を指定します。このとき、AppCard の構造に関するヒントをプロバイダに提供する AppCardContext
を指定します。
fun notifyAppCardRemoved(appIdentifier, String)
AppCard が有効でなくなったことを AppCard プロバイダに通知する。
fun notifyAppCardInteraction(appIdentifier, String, String, String)
AppCard が操作されたことを AppCard プロバイダに通知します。サポートされている操作はボタンのクリックのみで、AppCardMessageConstants.InteractionMessageConstants.MSG_INTERACTION_ON_CLICK
で表されます。
appIdentifier
、AppCard ID、コンポーネント ID、インタラクション ID を指定してこの関数を呼び出す onClick
リスナーを使用して、AppCard のボタンを作成することをおすすめします。
fun sendAppCardContextUpdate(AppCardContext, appIdentifier, String)
特定の AppCard の AppCardContext
の更新を送信します。たとえば、パーキング モードからドライブ モードにシフトする場合は、このメソッドを使用して、アクティブな AppCard ごとに isInteractable
が false
に設定された AppCardContext
アップデートを送信します。
よくある質問
実装例はどこで確認できますか?
各 AppCardContentProvider
がサポートできる AppCard の数
AppCardContentProvider
は、無数の AppCard をサポートできます。ただし、AppCard の数は、パフォーマンスの低下とユーザー エクスペリエンスの向上のバランスを考慮して設定してください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-06-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 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."]]