讓您的應用程式在具備 Android Auto 或 Android Automotive OS 環境的車輛上運作。單一應用程式架構即可相容兩種環境,每一位使用者都能暢享您的應用程式。
什麼是車輛專用 Android?
車用媒體應用程式可讓使用者輕鬆連結自己的數位生活與車輛。將相同的手機應用程式擴充至汽車,即可打造更優質的使用者體驗。您可以整合 Android Auto 或 Android Automotive OS 來達成這項目標。
車用 Android 應用程式的首要重點應為避免駕駛人分心。您可以採用語音指令和實用的視覺設計等最佳做法,盡量降低分心程度。如此一來,媒體應用程式就能只在相關時機向駕駛人顯示相關資訊,並且使用可預測的模式處理常見工作。
Android Auto
只要使用者擁有安裝 Android Auto 應用程式的 Android 手機和相容的汽車或副廠音響系統,就能充分享受 Android Auto 提供的優質車內應用程式體驗。使用者只要連結手機,就能直接在車上螢幕使用您的應用程式。開發人員只要建立適用的服務,透過 Android Auto 顯示專為駕駛人設計的使用介面,就能讓 Android Auto 與手機應用程式彼此連線。
Android Automotive OS
Android Automotive OS 是內建於車輛的 Android 資訊娛樂系統。車輛系統是針對駕駛情境最佳化的獨立 Android 裝置,應用程式會直接安裝到 Android Automotive OS 車輛系統而非手機。
支援的應用程式類別
使用者可透過媒體應用程式在車上瀏覽及播放音樂、電台、有聲書和其他音訊內容。詳情請參閱「建構車用音訊播放應用程式」。如需更多資訊,請參閱「打造車用媒體應用程式」。
媒體應用程式是使用 MediaLibraryService
和 MediaSession
建構。在 Android Automotive OS 上,您也可以使用 View 或 Compose 建構登入和設定畫面 (供車輛停妥時使用)。
唯有停妥車輛,使用者才能用影片應用程式觀看串流影片。這類應用程式的主要用途是播放串流影片,這些應用程式是使用 View 或 Compose 建構而成。詳情請參閱「建構適用於 Android Automotive OS 的影片播放應用程式」。詳情請參閱「建構適用於 Android Automotive OS 的影片應用程式」。
建構車輛專用音訊播放應用程式
本指南假設您已經有基本的媒體播放應用程式。如果您尚未這麼做,請前往「建立基本的媒體播放器應用程式」頁面,開始建立程序。
本指南會提供您需要採取的行動,包括指向其他資源的連結,以及具體指引。
播放元件
Media3 提供了一些播放用途的重要元件。如果您曾使用過先前的 Android 媒體程式庫,就會熟悉這些元件的組成類別。
下圖說明這些元件在一般應用程式中如何共同運作。
詳情請參閱「播放元件」。
實作 MediaLibraryService
和 MediaLibrarySession
MediaLibraryService
提供標準化 API,可提供媒體庫並允許存取媒體庫。在媒體應用程式中新增對 Android Auto 或 Android Automotive OS 的支援時,必須執行這項操作,因為這些平台會為媒體資料庫提供專屬的駕駛安全 UI。如要進一步瞭解如何實作及使用 MediaLibraryService
,請參閱「使用 MediaLibraryService 提供內容」。
如要使用播放控制選項,請使用媒體工作階段。MediaSession
API 提供與音訊或影片播放器互動的通用方式。Jetpack Media3 程式庫包含 MediaLibrarySession
,可擴充 MediaSession
以新增內容瀏覽 API。
將媒體工作階段連結至播放器,可讓應用程式在外部宣傳媒體播放內容,並接收來自外部來源 (例如 Android Auto、Android Automotive OS 或 Google 助理) 的播放指令。詳情請參閱「使用 MediaSession 控制及通告播放功能」和「使用 MediaLibrarySession」。
媒體工作階段至少應宣告支援下列播放器指令:
啟用播放控制項指南說明如何自訂車內的播放控制項。
當 Android Auto 或 Android Automotive OS 連線至您的應用程式時,會要求要顯示的內容資料庫,進而觸發 onGetLibraryRoot()
回呼方法。您可以快速傳回根媒體項目,以便存取媒體庫。當 Android Auto 或 Android Automotive OS 嘗試瀏覽內容資料庫的更深層級別時,系統會呼叫 onGetChildren()
回呼方法。
這些平台會對內容資料庫的結構強制執行額外限制。如要進一步瞭解如何自訂內容資料庫的顯示方式,請參閱「建立媒體瀏覽器服務」指南。
宣告支援 Android Auto
請使用下列資訊清單項目宣告手機應用程式支援 Android Auto:
<application>
...
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
這個資訊清單項目參照的 XML 檔案會宣告應用程式支援的汽車功能。如要表示您有提供媒體應用程式,請在專案的 res/xml/
目錄中新增名為 automotive_app_desc.xml
的 XML 檔案。此檔案應包含下列內容:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
宣告支援 Android Automotive OS
您需要建立汽車模組,因為應用程式中的邏輯並非全部都能與汽車應用程式共用。Android Automotive OS 的部分元件 (例如資訊清單) 設有平台專屬的需求。建立模組,將這些元件的程式碼與專案中的其他程式碼 (例如用於行動應用程式的程式碼) 區隔開來。
如要在專案中新增汽車模組,請按照下列步驟進行:
- 在 Android Studio 中,依序點選「File」>「New」>「New Module」。
- 選取「Automotive Module」,然後按一下「Next」。
- 輸入「Application/Library name」。這是使用者會在 Android Automotive OS 上看到的應用程式名稱。
- 輸入「Module name」。
- 依據您的應用程式調整「Package name」。
將「Minimum SDK」設為「API 28: Android 9.0 (Pie)」,然後點選「Next」。
所有支援 Android Automotive OS 的車輛均搭載 Android 9 (API 級別 28) 以上版本,因此選取這個值可指定所有相容的車輛。
選取「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:
<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_LAUNCHER
或 ACTION_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>
後續步驟
您現已擁有適用於 Android Auto 和 Android Automotive OS 的應用程式,建議您採取額外步驟來最佳化應用程式,使其在行車時更加安全。如需更多建議,以確保提供安全且便利的使用者體驗,請參閱語音操作、防干擾措施和錯誤處理的技術指南。
建構適用於 Android Automotive OS 的影片播放應用程式
由於影片應用程式與車輛中的媒體應用程式分類不同,因此您必須瞭解影片應用程式的特定規定,詳情請參閱「建構可在停車時使用的 Android Automotive OS 應用程式」和「建構適用於 Android Automotive OS 的影片應用程式」。請按照下列操作說明進行。
將應用程式標示為影片應用程式
如要指出您的應用程式支援影片功能,請在專案的 res/xml/ 目錄中加入名稱為 automotive_app_desc.xml
的 XML 檔案。在這個檔案中加入以下內容:
<automotiveApp>
<uses name="video"/>
</automotiveApp>
接著,請在資訊清單的 application
元素中加入下列 meta-data
元素,以參照 XML 檔案:
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>