Starting March 27, 2025, we recommend using android-latest-release
instead of aosp-main
to build and contribute to AOSP. For more information, see Changes to AOSP.
Create an AppCard
Stay organized with collections
Save and categorize content based on your preferences.
To create an AppCard, an app must create a provider in the manifest that extends
AppCardContentProvider
. The AppCardContentProvider
abstracts away underlying
details to facilitate the creation of AppCards.
Manifest declaration
To create an AppCard, an app must create a provider in the manifest to extend
AppCardContentProvider
.
<provider android:name=".SimpleAppCardContentProvider"
android:authorities="com.example.appcard.sample.media"
android:permission="@string/host_permission"
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="com.android.car.appcard.APP_CARD_PROVIDER" />
</intent-filter>
</provider>
Only one provider can be defined per package and with these properties:
android:exported="true"
android:enabled="true"
android:permission="@string/host_permission"
OR,
@string/host_permission
exists in the AppCard library and defines a
permission depending on the Android API version of the system.
Using the string resource works only when building with Gradle. When using
Soong, specify the explicit string with the string resource value according
to the appropriate resource qualifier.
(default) android:grantUriPermissions="false"
(default) android:forceUriPermissions="false"
To avoid unexpected results, it's required that the provider define a single
authority only in android:authorities
.
Declare an action-based intent filter,
com.android.car.appcard.APP_CARD_PROVIDER
Extend AppCardContentProvider
This section describes override and protected final methods.
Override methods
val authority: String
Use this method to return the authority defined in the
android:authorities
manifest property.
fun onCreate(): Boolean
This method must call super.onCreate()
. Use this
method to set up functionality that could potentially cause a delay if set
up when an AppCard is requested.
val appCardIds: List
Use this method to return the list of supported AppCard IDs. We
recommend making each ID verbose since this string is used to log errors.
fun onAppCardAdded(String, AppCardContext): AppCard
This method is called when an AppCard is shown for the first time and
provides the ID related to the AppCard and the AppCardContext
that provide
hints as to how the AppCard is displayed.
Use this method to set up any functionality required by the AppCards
supported as a provider. Once this function is called, the AppCard that
corresponds to the given ID is considered to be active.
fun onAppCardRemoved(String)
This method is called when no remaining instances of the AppCard are shown
to the user and handles all clean up. When this function is called, the AppCard
that corresponds to the given ID is considered inactive.
fun onAppCardContextChanged(String, AppCardContext)
This method is called when the system wants to update how an AppCard is
displayed and sends an updated AppCardContext
.
Protected final methods
fun sendAppCardUpdate(AppCard)
Invoke this method to queue an update for an active AppCard.
fun sendAppCardComponentUpdate(String, Component)
Invoke this method to queue an update for a component in an active
AppCard. If the given component is tagged with EnforceFastUpdateRate
, then
the update is sent immediately.
FAQ
Where are the sample implementations?
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-06-12 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-06-12 UTC."],[],[],null,["# Create an AppCard\n\nTo create an AppCard, an app must create a provider in the manifest that extends\n`AppCardContentProvider`. The `AppCardContentProvider` abstracts away underlying\ndetails to facilitate the creation of AppCards.\n\nManifest declaration\n--------------------\n\nTo create an AppCard, an app must create a provider in the manifest to extend\n`AppCardContentProvider`. \n\n \u003cprovider android:name=\".SimpleAppCardContentProvider\"\n android:authorities=\"com.example.appcard.sample.media\"\n android:permission=\"@string/host_permission\"\n android:exported=\"true\"\n android:enabled=\"true\"\u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"com.android.car.appcard.APP_CARD_PROVIDER\" /\u003e\n \u003c/intent-filter\u003e\n \u003c/provider\u003e\n\n**Only one provider can be defined per package** and with these properties:\n\n- `android:exported=\"true\"`\n- `android:enabled=\"true\"`\n- `android:permission=\"@string/host_permission\"`\n\n OR,\n - `android:readPermission=\"@string/host_permission\"`\n\n AND,\n\n `android:writePermission=\"@string/host_permission\"`\n- `@string/host_permission` exists in the AppCard library and defines a\n permission depending on the Android API version of the system.\n\n Using the string resource works only when building with Gradle. When using\n Soong, specify the explicit string with the string resource value according\n to the appropriate resource qualifier.\n- (*default* ) `android:grantUriPermissions=\"false\"`\n\n- (*default* ) `android:forceUriPermissions=\"false\"`\n\n To avoid unexpected results, it's required that the provider define a single\n authority **only** in `android:authorities`.\n- Declare an action-based intent filter,\n `com.android.car.appcard.APP_CARD_PROVIDER`\n\nExtend AppCardContentProvider\n-----------------------------\n\nThis section describes **override** and **protected** final methods.\n\n### Override methods\n\n\u003cbr /\u003e\n\n`val authority: String` Use this method to return the authority defined in the `android:authorities` manifest property.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onCreate(): Boolean` This method must call `super.onCreate()`. Use this method to set up functionality that could potentially cause a delay if set up when an AppCard is requested.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`val appCardIds: List` Use this method to return the list of supported AppCard IDs. We recommend making each ID verbose since this string is used to log errors.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onAppCardAdded(String, AppCardContext): AppCard` This method is called when an AppCard is shown for the first time and provides the ID related to the AppCard and the `AppCardContext` that provide hints as to how the AppCard is displayed.\n\n\u003cbr /\u003e\n\nUse this method to set up any functionality required by the AppCards\nsupported as a provider. Once this function is called, the AppCard that\ncorresponds to the given ID is considered to be **active.**\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onAppCardRemoved(String)` This method is called when no remaining instances of the AppCard are shown to the user and handles all clean up. When this function is called, the AppCard that corresponds to the given ID is considered **inactive.**\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun onAppCardContextChanged(String, AppCardContext)` This method is called when the system wants to update how an AppCard is displayed and sends an updated `AppCardContext`.\n\n\u003cbr /\u003e\n\n### Protected final methods\n\n\u003cbr /\u003e\n\n`fun sendAppCardUpdate(AppCard)` Invoke this method to queue an update for an active AppCard.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n`fun sendAppCardComponentUpdate(String, Component)` Invoke this method to queue an update for a component in an active AppCard. If the given component is tagged with `EnforceFastUpdateRate`, then the update is sent immediately.\n\n\u003cbr /\u003e\n\nFAQ\n---\n\nWhere are the sample implementations?\n\n- [Calendar AppCard](https://android.googlesource.com/platform/packages/apps/Car/libs/+/refs/tags/ub-automotive-master-20250418/car-app-card-lib/sample-calendar-app/)\n- [Media AppCard](https://android.googlesource.com/platform/packages/apps/Car/libs/+/refs/tags/ub-automotive-master-20250418/car-app-card-lib/sample-media-app/)\n- [Weather AppCard](https://android.googlesource.com/platform/packages/apps/Car/libs/+/refs/tags/ub-automotive-master-20250418/car-app-card-lib/sample-weather-app/)"]]