建構可在車輛停妥時使用的 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 裝置設為目標平台。選擇將應用程式發行至 Android Automotive OS 裝置後,相容的應用程式就會經過人工審查,確保在車上使用安全無虞。詳情請參閱「發布至車輛」。

必要的 Android Automotive OS 功能

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

<manifest ...>
  ...
  <!--
    Depending on the track you choose to distribute your app, the android:required attribute can
    also be "false" or left unset. See Choose a track for Android Automotive OS.
  -->
  <uses-feature
      android:name="android.hardware.type.automotive"
      android:required="[true|false]" />
  ...
</manifest>

除了上述程式碼範例中顯示的元素外,針對 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) 已禁止應用程式控制系統資訊列,應用程式呼叫 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 資源集使用較大的值,讓觸控目標更大。

發布應用程式

根據車用應用程式所屬類別的品質指南測試應用程式後,您就能使用 Google Play 將應用程式發布至內建 Google 的車輛。如要進一步瞭解發布程序,請參閱「發布至車輛」。

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

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

建立新問題