讓您的媒體應用程式支援 Android Automotive OS

Android Automotive OS 可讓使用者在車輛中安裝應用程式。為觸及這個平台的使用者,您必須發布專為駕駛人設計且與 Android Automotive OS 相容的應用程式。您可以重複使用 Android Auto 應用程式中絕大部分的程式碼和資源,但必須建立符合本頁面規定的獨立版本。

開發總覽

新增對 Android Automotive OS 的支援只需完成幾個步驟,如以下各節所述:

  1. 在 Android Studio 中啟用汽車功能
  2. 建立汽車模組
  3. 更新 Gradle 依附元件
  4. 實作設定和登入活動 (選用)
  5. 視需要讀取媒體主機提示

設計須知

Android Automotive OS 會從應用程式的媒體瀏覽器服務接收媒體內容,並完成這些內容的版面配置作業。也就是說,您的應用程式不會繪製使用者介面,而且當使用者觸發媒體播放程序時,也不會啟動任何活動。

如果您要實作設定或登入活動,這些活動必須是專為車輛用途設計。建議您在設計應用程式的相關區域時,參考 Android Automotive OS 適用的設計指南

設定專案

在應用程式專案中,您必須先設定幾個部分,才能啟用 Android Automotive OS 的支援功能。

在 Android Studio 中啟用汽車功能

請使用 Android Studio 4.0 或以上版本,確保所有 Automotive OS 功能均已啟用。

建立汽車模組

Android Automotive OS 的部分元件 (例如資訊清單) 對於作業平台有一定的要求。您建立的模組必須能夠區隔這些元件的程式碼與專案中的其他程式碼 (例如用於手機應用程式的程式碼)。

如要在專案中新增汽車模組,請按照下列步驟進行:

  1. 在 Android Studio 中,依序點選「File」>「New」>「New Module」
  2. 選取「Automotive Module」,然後按一下「Next」
  3. 輸入「Application/Library name」。這是使用者會在 Android Automotive OS 上看到的應用程式名稱。
  4. 輸入「Module name」
  5. 依據您的應用程式調整「Package name」
  6. 將「Minimum SDK」設為「API 28: Android 9.0 (Pie)」,然後點選「Next」

    所有支援 Android Automotive OS 的車輛均搭載 Android 9 (API 級別 28) 以上版本,因此選取這個值可指定所有相容的車輛。

  7. 選取「No Activity」,然後按一下「Finish」

在 Android Studio 中建立模組後,請在新的汽車模組中開啟 AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

application 元素提供一些標準應用程式資訊,以及宣告支援 Android Automotive OS 的 uses-feature 元素。請注意,資訊清單中未宣告任何活動。

如果您要實作設定或登入活動,請在此新增這些項目。這些活動是由系統透過明確意圖觸發,而且是您在 Android Automotive OS 應用程式的資訊清單中唯一宣告的活動。

新增任何設定或登入活動後,請在 application 元素中設定 android:appCategory="audio" 屬性並新增下列 uses-feature 元素,完成資訊清單檔案:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.landscape"
        android:required="false" />

</manifest>

將這些功能明確設定為 required="false",可確保應用程式不會與 Automotive OS 裝置提供的硬體功能發生衝突。

宣告對 Android Automotive OS 的媒體支援

使用下列資訊清單項目宣告您的應用程式支援 Android Automotive OS:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

這個資訊清單項目參照的 XML 檔案會宣告應用程式支援的汽車功能。

如要表示您有提供媒體應用程式,請在專案的 res/xml/ 目錄中新增名為 automotive_app_desc.xml 的 XML 檔案。在這個檔案中加入以下內容:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

意圖篩選器

Android Automotive OS 會使用明確意圖來觸發媒體應用程式中的活動。請勿在資訊清單檔案中納入任何具有 CATEGORY_LAUNCHERACTION_MAIN 意圖篩選器的活動。

如以下範例中的活動通常會指定手機或其他行動裝置。請在建構手機應用程式的模組中宣告這些活動,而不是在建構 Android Automotive OS 應用程式的模組中進行宣告。

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

更新 Gradle 依附元件

建議您將媒體瀏覽器服務存放在可供手機應用程式與汽車模組共用的獨立模組中。如要使用這個方法,您必須更新車用模組以加入該共用模組,如以下程式碼片段所示:

my-auto-module/build.gradle

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

實作設定和登入活動

除了媒體瀏覽器服務外,您還可以為 Android Automotive OS 應用程式提供專為車輛用途設計的設定和登入活動。這類活動可讓您提供未包含在 Android Media API 中的應用程式功能。

只有在 Android Automotive OS 應用程式需要讓使用者登入或指定應用程式設定時,您才需要實作這類活動。Android Auto 不會使用這些活動。

活動工作流程

以下圖表顯示使用者如何透過 Android Automotive OS 與設定和登入活動互動:

設定和登入活動的工作流程

圖 1. 設定和登入活動工作流程。

避免在設定和登入活動中出現干擾

為確保設定和/或登入活動只能在使用者車輛停妥後使用,請確認 <activity> 元素不包含下列 <meta-data> 元素。如果您的應用程式含有這類元素,將在審查期間遭到拒絕。

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

新增設定活動

您可以新增專為車輛用途設計的設定活動,讓使用者調整車輛的應用程式設定。設定活動也能提供其他工作流程,例如登入或登出使用者帳戶,或是切換使用者帳戶。請注意,這類活動只會由在 Android Automotive OS 上執行的應用程式觸發,不會提供給連接至 Android Auto 的手機應用程式使用。

宣告設定活動

您必須在應用程式的資訊清單檔案中宣告設定活動,如以下程式碼片段所示:

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

實作設定活動

當使用者啟動應用程式時,Android Automotive OS 會偵測您宣告的設定活動,並顯示預設用途 (例如圖示)。使用者可透過車輛的螢幕輕觸或選取這項預設用途,以便切換到該活動。Android Automotive OS 會傳送 ACTION_APPLICATION_PREFERENCES 意圖,告知應用程式要啟動設定活動。

本節的其餘部分將說明如何調整 Android 通用音樂播放器 (Universal Android Music Player,簡稱 UAMP) 範例應用程式的程式碼,以實作應用程式的設定活動。

首先,請下載程式碼範例:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

如要實作活動,請按照下列步驟操作:

  1. automotive/automotive-lib 資料夾複製到車用模組中。
  2. 參考 automotive/src/main/res/xml/preferences.xml 的內容,定義偏好設定樹狀結構。
  3. 實作設定活動要顯示的 PreferenceFragmentCompat。詳情請參閱 UAMP 中的 SettingsFragment.ktSettingsActivity.kt 檔案,以及 Android 設定指南

實作設定活動時,建議您採用下列最佳做法,使用 Preference 程式庫中的部分元件:

  • 不要在設定活動的主要檢視畫面以下提供超過兩個層級的深度。
  • 不要使用 DropDownPreference,而是改用 ListPreference
  • 機構元件:
  • 在下列所有元件中加入 keytitle。您也可以加入 summaryicon,或同時加入兩者:
    • Preference
      • PreferenceFragmentCompat 實作的 onPreferenceTreeClick() 回呼中自訂邏輯。
    • CheckBoxPreference
      • 條件式文字可以包含 summaryOnsummaryOff,而非 summary
    • SwitchPreference
      • 條件式文字可以包含 summaryOnsummaryOff,而非 summary
      • 可以包含 switchTextOnswitchTextOff
    • SeekBarPreference
      • 加入 minmaxdefaultValue
    • EditTextPreference
      • 加入 dialogTitlepositiveButtonTextnegativeButtonText
      • 可以包含 dialogMessage 和/或 dialogLayoutResource
    • com.example.android.uamp.automotive.lib.ListPreference
      • 多數衍生自 ListPreference
      • 用於顯示 Preference 物件的單選清單。
      • 必須具備 entries 陣列和對應的 entryValues
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • 多數衍生自 MultiSelectListPreference
      • 用於顯示 Preference 物件的多選擇清單。
      • 必須具備 entries 陣列和對應的 entryValues

新增登入活動

如果應用程式規定使用者必須登入才能使用應用程式,您可以新增專為車輛用途設計的登入活動,用來處理應用程式的登入及登出作業。您也可以在設定活動中新增登入和登出工作流程,但要是使用者必須先登入才能使用應用程式,請使用專屬的登入活動。請注意,這類活動只會由在 Android Automotive OS 上執行的應用程式觸發,不會提供給連接至 Android Auto 的手機應用程式使用。

在應用程式啟動時要求登入

如要要求使用者先登入才能使用應用程式,則媒體瀏覽器服務必須執行以下作業:

  1. 在服務的 onLoadChildren() 方法中,使用 sendResult() 方法傳送 null 結果。
  2. 使用 setState() 方法,將媒體工作階段的 PlaybackStateCompat 設為 STATE_ERROR,藉此告知 Android Automotive OS 必須等到錯誤解決才能執行任何其他作業。
  3. 將媒體工作階段的 PlaybackStateCompat 錯誤代碼設為 ERROR_CODE_AUTHENTICATION_EXPIRED,藉此告知 Android Automotive OS 使用者必須進行驗證。
  4. 使用 setErrorMessage() 方法,設定媒體工作階段的 PlaybackStateCompat 錯誤訊息。由於系統會向使用者顯示這類錯誤訊息,請依據使用者目前所在地區完成訊息本地化作業。
  5. 使用 setExtras() 方法,設定媒體工作階段的 PlaybackStateCompat 額外項目,並加入下列兩個鍵:

下列程式碼片段說明應用程式如何要求使用者先登入才能使用應用程式:

Kotlin

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Java

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

使用者驗證成功後,將 PlaybackStateCompat 設回 STATE_ERROR 以外的狀態,然後呼叫活動的 finish() 方法,將使用者帶回 Android Automotive OS。

實作登入活動

Google 提供多種身分識別工具,讓您用來協助使用者登入車輛專用應用程式。部分工具 (例如 Firebase 驗證) 提供完整堆疊的工具包,可協助您建構自訂的驗證體驗。其他工具則會利用使用者現有的憑證或其他技術,協助您為使用者打造順暢的登入體驗。

下列工具可協助您為先前已在其他裝置上登入帳戶的使用者打造更簡便的登入體驗:

  • One Tap 登入與註冊:如果您已經為其他裝置 (例如手機應用程式) 導入 One Tap 機制,請將此機制導入 Android Automotive OS 應用程式,支援現有的 One Tap 使用者。
  • Google 登入:如果您已為其他裝置 (例如手機應用程式) 導入 Google 登入機制,請將此機制導入 Android Automotive OS 應用程式,支援現有的 Google 登入使用者。
  • Google 自動填入功能:如果使用者已在其他 Android 裝置上選擇使用 Google 自動填入功能,他們的憑證就會儲存在 Google 密碼管理工具中。當這些使用者登入 Android Automotive OS 應用程式時,Google 自動填入功能就會提供相關的已儲存憑證建議。一般的應用程式都能直接使用 Google 自動填入功能,因此開發人員並不需要額外投注心力;不過,應用程式開發人員可以進行應用程式最佳化,進一步改善自動填入的結果。 搭載 Android Oreo 8.0 (API 級別 26) 以上版本 (包括 Android Automotive OS) 的所有裝置均支援 Google 自動填入功能。

使用 AccountManager

設有驗證功能的 Android Automotive OS 應用程式都必須使用 AccountManager,原因如下:

  • 提供更優質的使用者體驗和簡便的帳戶管理功能:使用者可透過系統設定中的帳戶選單輕鬆管理所有帳戶 (包括登入及登出帳戶)。
  • 「訪客」體驗:車輛為共用裝置,表示原始設備製造商 (OEM) 可以在車輛上啟用「訪客」體驗,禁止新增帳戶。這項限制是透過 AccountManagerDISALLOW_MODIFY_ACCOUNTS 達成。

權限

如需要求使用者授予權限,請使用上一節所示活動工作流程圖中的驗證活動或設定活動。

讀取媒體主機提示

視連結至媒體瀏覽器服務的系統應用程式 (包括其版本) 而定,應用程式可能會收到下列額外項目:

處理錯誤

Android Automotive OS 上的媒體應用程式錯誤會透過媒體工作階段的 PlaybackStateCompat 傳達。請針對所有錯誤,在 PlaybackStateCompat 中設定適當的錯誤代碼和錯誤訊息。這漾一來,使用者介面就會顯示 Toast

如果發生錯誤,但播放作業可以繼續進行,請發出非重大錯誤。舉例來說,使用者可能不須登入應用程式就能播放音樂,但必須登入才能跳過歌曲。使用一般錯誤時,系統可以建議使用者登入,而不會中斷當下播放的媒體項目。

當您發出非重大錯誤時,除了錯誤代碼和錯誤訊息之外,請原封不動保留 PlaybackStateCompat 的其他內容。運用這種做法可在使用者決定是否要登入時,繼續播放目前媒體項目。

媒體項目無法播放 (例如沒有網路連線且無離線內容) 時,請將 PlaybackStateCompat 狀態設為 STATE_ERROR

後續更新 PlaybackStateCompat 時,請清除所有錯誤代碼和錯誤訊息,避免針對相同錯誤重複顯示警告。

如果您在某些時間點無法載入瀏覽樹狀結構 (例如需要驗證但使用者未登入時),請傳送空白的瀏覽樹狀結構。為表示這種情況,請為根層級媒體節點從 onLoadChildren() 傳回空值結果。在此情況下,系統會根據 PlaybackStateCompat 中設定的錯誤訊息顯示全螢幕錯誤。

可採取行動的錯誤

如果是可採取行動的錯誤,請在 PlaybackStateCompat 中設定下列兩個額外項目:

可採取行動的錯誤會顯示為 Dialog,且使用者只能在車輛停止時解決錯誤。

測試錯誤案例

確認應用程式能夠妥善處理在所有情境下發生的錯誤,包括:

  • 產品的不同層級:例如免費與付費產品,或是已登入與已登出的狀態。
  • 不同的行駛狀態:例如停車與行駛中。
  • 不同的連線狀態:例如在線上與離線。

其他考量

開發 Android Automotive OS 應用程式時,請考量下列幾點:

離線內容

在適用情況下,請為應用程式實作離線支援功能。一般來說,搭載 Android Automotive OS 的車輛應具備專屬的數據連線,也就是內含於車輛費用或使用者付費的數據方案。不過,與行動裝置相較,車輛也應提供更多樣化的連線方式。

將離線支援策略納入考量時,請留意下列事項:

  • 應用程式正在使用的當下是下載內容的最佳時機。
  • 請勿假設有可供使用的 Wi-Fi。車輛可能未進入 Wi-Fi 訊號範圍內,或者原始設備製造商 (OEM) 可能偏好使用行動網路,因而停用了 Wi-Fi。
  • 儘管可以使用智慧型快取機制,下載您預期使用者會使用的內容,我們仍建議您讓使用者透過設定活動來變更這項行為。
  • 車輛上的磁碟空間各有不同,因此建議您讓使用者能夠刪除離線內容,例如透過設定活動中的選項加以刪除。

WebView 支援

Android Automotive OS 雖然支援 WebView,但只能在設定和登入活動中使用這項功能。使用 WebView 的活動必須具備 WebView 外部的「關閉」或「返回」功能提示。

以下列舉幾種 WebView 可接受的用途:

  • 在設定活動中顯示隱私權政策、服務條款或其他法律相關連結。
  • 登入活動中的網頁式流程。

使用 WebView 時,您可以啟用 JavaScript

確保 WebView 安全性

請採取所有可能的預防措施,確保您的 WebView 不會做為廣大網際網路的進入點。請參閱以下程式碼片段範例,瞭解如何將 WebView 鎖定在 loadUrl() 呼叫所用的網址,並防止執行重新導向作業。我們強烈建議您在可行的情況下導入這類保護措施,例如在顯示法律相關連結時。

Kotlin

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Java

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

套件名稱

由於您發布了 Android Automotive OS 專用的獨立 Android 應用程式套件 (APK),因此可以重複使用您行動應用程式中的套件名稱,或者建立新的套件名稱。如果您使用其他套件名稱,應用程式會有兩筆獨立的 Play 商店資訊。若重複使用既有套件名稱,應用程式則會在兩個平台共用同一筆商店資訊。

您可以依據業務考量決定採用哪一種做法。舉例來說,假設您有一個團隊負責開發行動應用程式,而另一個獨立的團隊負責開發 Android Automotive OS 應用程式,就非常適合使用不同的套件名稱,讓兩個團隊各自管理自己的 Play 商店資訊。無論採用哪一種方式,在技術上所需投入的人力差異不大。

下表摘要說明保留既有套件名稱與使用新的套件名稱之間的其他主要差異:

功能 相同套件名稱 新建套件名稱
商店資訊 單個 多個
鏡像安裝 是:在設定精靈中「快速重新安裝應用程式」
Play 商店審核程序 封鎖審查:如果其中一個 APK 未通過審查,透過同一個版本提交的其他 APK 會一併遭到封鎖 個別審查
統計資料、指標和 Android Vitals 合併:您可以篩選汽車專屬資料。 分用
建立索引和搜尋排名 依據現有記錄建立 不會沿用
與其他應用程式整合 通常無須變更 (假設兩個 APK 共用同一組媒體程式碼) 可能需要更新對應的應用程式 (例如透過 Google 助理執行 URI 播放)

常見問題

請參閱以下章節,取得部分 Android Automotive OS 相關常見問題的解答。

硬體

我的應用程式可以存取麥克風嗎?

如果應用程式指定的是 Android 10 (API 級別 29) 以上版本,請參閱分享音訊輸入說明文件。這種做法不適用於 API 級別 29 之前的版本。

我們可以使用哪些 Car API?做法如何?

您只能使用由原始設備製造商 (OEM) 公開的 API。我們正在開發相關程序,為這些 API 的存取方式制定標準。

應用程式可以使用 CarPropertyManager 中的 SetProperty()GetProperty() 存取 Car API。如要查看所有可用屬性的清單,請參閱原始碼參考資料說明文件。如果屬性已使用 @SystemApi 加上註解,則僅限用於預先載入的系統應用程式。

系統支援哪些類型的音訊轉碼器?

請參閱 Android CDD 中的音訊轉碼器詳細資料

系統是否支援 Widevine 數位版權管理?

可以。支援 Widevine 數位版權管理

開發和測試

使用第三方 SDK 和程式庫是否有任何限制或建議?

我們並未針對第三方 SDK 和程式庫制定具體的使用規範。如果選擇使用第三方 SDK 和程式庫,您仍須遵守所有車輛應用程式的品質規範。

我可以使用前景服務嗎?

前景服務僅允許用於下載內容供離線使用。如果您想針對其他前景服務用途尋求支援,請透過 Android Automotive OS 討論群組與我們聯絡。

發布 Android Automotive OS 應用程式

如何使用 Google Play 管理中心發布 Android Automotive OS 應用程式?

如要進一步瞭解如何透過 Google Play 管理中心發布 Android Automotive OS 應用程式,請參閱「發布至車輛」一文。

其他資源

如要進一步瞭解 Android Automotive OS,請參閱下列其他資源。

範例

指南

網誌

影片

回報 Android Automotive OS 媒體相關問題

如果您在開發適用於 Android Automotive OS 的媒體應用程式時遇到問題,可以使用 Google Issue Tracker 回報問題。在問題範本中,請務必填寫所有必要資訊。

建立新問題

提交新問題之前,請確認該問題是否已回報至問題清單中。您可以在追蹤程式中按一下該問題的星號,訂閱該問題並投下一票。詳情請參閱訂閱問題一文。