建構可在車輛停妥時使用的 Android Automotive OS 應用程式

除了行車期間使用的應用程式外,Android Automotive OS 也支援建構可停車時使用的瀏覽器遊戲影片應用程式。您可以略微修改適用於大螢幕裝置的做法,即可為車輛提供同一款應用程式。

在 Android Automotive OS 模擬器測試現有應用程式

如要開始建構適用於 Android Automotive OS 的應用程式,請先在 Android Automotive OS 模擬器測試現有應用程式。如要設定模擬器,請按照「使用 Android Automotive OS 模擬器進行測試」的步驟操作,然後依據「在模擬器上執行應用程式」說明,執行應用程式。

執行應用程式時請留意相容性問題,例如:

  • 資訊娛樂系統的畫面為固定螢幕方向。為符合車用應用程式品質指南規定,應用程式必須同時支援直向和橫向螢幕方向。
  • 其他裝置適用的 API 可能不適用於 Android Automotive OS。舉例來說,Android Automotive OS 並不支援某些 Google Play 服務 API。如要進一步瞭解如何處理這些問題,請參閱「停用功能」一節。

設定應用程式的資訊清單檔案

應用程式必須含有特定的資訊清單項目,才能將 Android Automotive OS 設為目標平台。如果您已經滿足這個條件,就能使用獨立的 Automotive OS 版本類型,將指定 Android Automotive OS 的應用程式提交至 Play 商店。這類應用程式會經過人工審查,確保在車上使用安全無虞。詳情請參閱「發布車用的 Android 應用程式」。

必要的 Android Automotive OS 功能

針對 Android Automotive OS 建構的應用程式必須在 AndroidManifest.xml 檔案中加入下列 <uses-feature> 元素,才能在車用 Play 商店上架:

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

如果應用程式提交至非車用測試群組,就無法宣告上述程式碼範例中顯示的 <uses-feature> 元素,因為這些應用程式無法以汽車專用硬體進行測試。因此,如要為車用和非車用裝置提供相同的應用程式,您需要至少產生兩個應用程式變種版本:一個用於車用裝置,另一個則用於行動裝置。如要進一步瞭解如何建立這些獨立的變種版本,請參閱下列說明文件:

應用程式的兩個變種版本可共用相同的套件名稱,但必須使用不同的版本代碼,因為這些變種版本會分別上傳到 Play 商店測試群組。

或者,行動裝置、車輛 APK 或應用程式套件都用不同套件名稱,不用個別變種版本也可以。如要瞭解各種做法的優缺點,請參閱媒體應用程式開發人員指南中的「套件名稱」一節。

除了上述程式碼範例中顯示的元素外,針對 Android Automotive OS 建構的應用程式也必須在根 <manifest> 元素中加入下列 <uses-feature> 元素:

<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"/>

如果您將這些功能明確設為非必要功能,就能確保應用程式不會與 Android Automotive OS 裝置中可用的硬體功能衝突

確認沒有分心因素已排除的活動

為確保您的應用程式只能在車輛停妥後使用,請勿在資訊清單的任何 <activity> 元素中加入下列 <meta-data> 元素:

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

如果沒有這項中繼資料,OS 就會在車輛進入行車模式時自動封鎖應用程式活動,以免駕駛分心。這項操作會以 onPause 生命週期回呼的方式進行,期間您必須暫停播放應用程式中的影片和音訊。

為 Android Automotive OS 最佳化應用程式

為盡可能提供最佳使用者體驗,建構 Android Automotive OS 應用程式時,請留意下列事項。

為大螢幕進行最佳化調整

Android Automotive OS 車輛配備的螢幕,在大小、解析度和顯示比例方面與平板電腦和摺疊式裝置更相似。因此,針對大螢幕最佳化應用程式,車輛使用者也能同時受益。

具體而言,請參閱「支援不同的螢幕大小」和「將 UI 改為回應式版面配置」指南,進一步瞭解如何充分運用大螢幕尺寸以及媒體庫和遊戲庫,獲得設計靈感和指引。

其他大螢幕最佳化功能 (例如輸入相容性) 並未直接嘉惠 Android Automotive OS 應用程式,但仍可改善使用者體驗。舉例來說,鍵盤導覽功能會使用和旋轉導覽功能相同的 API,因此只要在其中進行最佳化調整,這兩種板型規格都能同時受益。

使用視窗插邊和螢幕凹口

與其他板型規格一樣,Android Automotive OS 包括狀態和導覽列等系統 UI 元素,並支援非矩形螢幕。

根據預設,應用程式繪製的區域不會與系統列或螢幕凹口重疊。不過,建議您讓應用程式隱藏系統列、在其後方繪製內容,或是在螢幕凹口中顯示內容,如「在視窗插邊中縮小應用程式」一節所述。如果您的應用程式符合上述任一條件,請參閱以下子節,進一步瞭解如何讓應用程式在 Android Automotive OS 裝置的生態系統中正常運作。

系統列、沉浸模式和無邊框算繪

車用系統列的大小和位置可能會與其他板型規格不同。例如導覽列可置於畫面的左側、右側或底部。即使頂端有狀態列和底部導覽列 (與大多數手機和平板電腦的情況相同),這些元素在車輛上的大小可能會較大。

此外,Android Automotive OS 還可允許原始設備製造商 (OEM) 控制應用程式能否顯示或隱藏系統資訊列以進入及退出沉浸模式。例如,藉由防止應用程式隱藏系統列,原始設備製造商 (OEM) 便可確保氣候控制等車輛控制選項隨時都能在螢幕上存取。如果原始設備製造商 (OEM) 已禁止應用程式控制系統列,當應用程式呼叫 WindowInsetsController (或 WindowInsetsControllerCompat) API 來顯示或隱藏系統列時,系統不會執行任何動作。請參閱 showhide 的說明文件,進一步瞭解如何偵測應用程式是否能夠修改插邊。

同樣地,原始設備製造商 (OEM) 也可以控制應用程式能否設定系統列的顏色和透明,確保它們包含的長條和元素隨時都清晰可見。如果應用程式採用無邊框設計,請確認只有非重要內容繪製在系統資訊列後方。如果裝置原始設備製造商 (OEM) 禁止設定長條的顏色或透明,可能就不會顯示這項內容。

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

如果應用程式採用無邊框設計,請勿假設系統列的大小、數量、類型或位置。請改用視窗插邊 API,根據系統列顯示應用程式內容。想進一步瞭解如何使用這些 API,請參閱「在應用程式中以無邊框方式顯示內容」。經過硬式編碼的邊框間距值;雖然不建議這麼做,但可能還是會將內容存放在其他可能不會出現在車內的安全區域。

適應不規則的螢幕

除了矩形顯示外,部分車輛的螢幕也可能是不規則形狀,如圖 1 所示:

Android Automotive OS 裝置的圖表,在右側以曲線呈現螢幕。
圖 1:在右側顯示弧形螢幕的 Android Automotive OS 裝置。綠色區域是指安全矩形,不會與曲線螢幕凹口的定界框重疊。

如果應用程式未採用無邊框轉譯方式,就無須採取任何行動,即可在安全區域內算繪。

如果應用程式採用無邊框算繪,您可以選擇呈現凹口的方式。您可以使用資源來完成此操作,方法是針對應用程式主題設定 android:windowLayoutInDisplayCutoutMode 屬性,或在執行階段修改視窗的 layoutInDisplayCutoutMode 屬性。

由於 Android Automotive OS 裝置呈現的螢幕凹口類型與行動裝置不同,因此請勿使用 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,因為該類型的行為已針對行動裝置的凹口完成最佳化。請改用 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVERLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS 來一律避免,或一律進入凹口。選擇後者時,如要進一步瞭解與螢幕凹口相關的 API,請參閱支援螢幕凹口

如果您的應用程式會轉譯成螢幕凹口,而且您希望在 Android Automotive OS 和行動裝置之間發揮不同行為,請參閱「停用功能」一文中的指引,瞭解應用程式是否會在執行階段設定此行為;如果應用程式使用資源檔案設定該行為,請參閱「使用替代資源」。

停用功能

如果您打算在 Android Automotive OS 上提供現有的行動應用程式,某些特性和功能可能會不適合或無法使用。舉例來說,汽車通常不會授予相機存取權限。此外,Android Automotive OS 只支援部分 Google Play 服務,詳情請參閱「車用 Google Play 服務」一文。

您可以使用 PackageManager.hasSystemFeature API,檢查應用程式是否具備 FEATURE_AUTOMOTIVE 功能,偵測應用程式是否在 Android Automotive OS 上執行。如以下範例所示:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

此外,如果您的應用程式也有 Android Auto 元件,則可使用 車輛專用 Android App Library 中的 CarConnection API 偵測應用程式是否在 Android Automotive OS 或 Android Auto 上執行,或是否未與任何車輛連線。

針對子母畫面 (PiP) 功能,請按照既定的最佳做法檢查該功能是否可用,並進行適當回應。

處理離線情況

雖然越來越多車輛都能連上網際網路,但仍建議您確保應用程式即使沒有網路連線也能執行,例如下列情況:

  • 使用者可能會選擇停用汽車製造商在訂閱套裝組合中提供的行動數據。
  • 部分地區的行動數據存取功能可能會受到限制。
  • 配備 Wi-Fi 無線電的車輛可能不在 Wi-Fi 訊號範圍內,或者原始設備製造商 (OEM) 可能停用 Wi-Fi 而改用行動網路。

為因應應用程式中的這些情境,請對需要網際網路連線的功能進行優雅降級,例如提供離線內容。詳情請參閱「最佳化網路的最佳做法」。

使用替代資源

為協助調整車輛應用程式,您可以在搭載 Android Automotive OS 的車輛上使用 car 資源限定詞,來提供替代資源。舉例來說,如果您使用維度資源來儲存邊框間距值,可以針對 car 資源集使用較大的值,讓觸控目標更大。

發布應用程式

根據車用應用程式所屬類別的品質指南測試應用程式、為其建構 Android Automotive OS 版本,並針對所屬類別完成所有必要變更後,接下來就能將應用程式發布至 Play 商店的 Automotive OS 板型規格測試群組。如要進一步瞭解發布程序,請參閱「發布車用的 Android 應用程式」。

針對停車才能用的應用程式提供意見回饋

如果您在開發停車才能用 Android Automotive OS 應用程式,可以使用 Google Issue Tracker 回報遇到的問題或功能要求。請務必在問題範本中填寫所有必要資訊。提交新問題之前,請確認該問題是否已回報至問題清單中。您可以在追蹤程式中按一下該問題的星號,訂閱該問題並投票。詳情請參閱「訂閱問題」一文。

建立新問題