實現系統 UI

Android Automotive 提供了專為車輛開發的新系統 UI。系統 UI 的大多數元件都與框架服務緊密耦合。系統 UI是指螢幕上顯示的不屬於應用程式一部分的任何元素。 Automotive System UI(位於 CarSystemUI 元素包中)是 Android System UI(位於 System UI 包中)的擴展,專為車輛量身定制。

什麼是系統使用者介面?

特定於汽車系統 UI 的元件包括:

成分描述
鎖定螢幕介面使用者透過特定使用者帳戶進行身份驗證的畫面。
導覽列系統列可以位於螢幕的左側、底部或右側,並且可以包括用於導航至不同應用程式的多面按鈕、切換通知面板以及提供車輛控制(例如 HVAC)。這與 Android 系統 UI 實作不同,後者提供「後退」、「主頁」和應用程式堆疊按鈕。
狀態列系統列位於螢幕上,用作導覽列。狀態列還提供支援以下功能:
  • 連接圖示。包括藍牙、Wi-Fi 和熱點/行動連線。
  • 下拉通知面板。例如,從螢幕頂部向下滑動。
  • 抬頭通知 (HUN)。
系統介面指螢幕上顯示的任何不屬於應用程式的元素。
使用者切換器使用者介面使用者可以透過此畫面選擇不同的使用者。
音量介面當驅動程式使用實體音量按鈕變更裝置上的音量時顯示的對話方塊。

系統使用者介面如何運作?

系統 UI 是一個 Android 應用程序,在裝置開機時運行。該應用程式是透過SystemServer的反射啟動的。以下列出了系統 UI 的使用者可見方面最相關的入口點。使用這些元件自訂 Android 系統 UI,以實現汽車特定的功能。

  • config_statusBarComponent
  • config_systemUIFactoryComponent

CarSystemUI 是 System UI 套件的擴展,這意味著 System UI 套件中的類別和資源可以被 CarSystemUI 套件使用和覆蓋。

自訂系統使用者介面

疊加層

雖然您可以修改 Android 原始碼來自訂系統 UI,但這樣做會使應用程式未來的 Android 更新變得更加困難和複雜。相反,Android 支援使用覆蓋目錄,這使您能夠在不修改原始程式碼的情況下替換資源檔案。在 Android 建置系統中,覆蓋系統以受控方式覆寫檔案。所有修改的文件都可以清楚地識別出來,而無需遍歷整個 AOSP 原始碼樹。

覆蓋檔案必須放置在PRODUCT_PACKAGE_OVERLAYS目錄中,並且必須具有與原始 AOSP 根結構完全相同的子資料夾。對於 Android 10 或更高版本, PRODUCT_PACKAGE_OVERLAYS設定為:

PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay

汽車系統 UI 使用系統 UICarSystemUI 套件中的資源,這意味著可以使用覆蓋層覆蓋每個位置的資源,以影響汽車系統 UI 的外觀。

若要取代文件,請在您指定的/overlay目錄中複製要替換的文件的目錄結構,然後將替換內容包含在該目錄中。例如,要替換:

frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml

新增位於下列位置的替換super_status_bar.xml檔案:

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

若要替換frameworks/base/packages/SystemUI/res/values/config.xml (在 System UI 中,而不是CarSystemUI),請將替換config.xml檔案新增至:

packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/

或者

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

下面提供了兩個主要客製化入口點的描述。

汽車系統 UI 可以在螢幕的左側、底部和右側有三個導覽列。每個系統列的可見性可透過以下配置進行切換:

  • config_enableLeftSystemBar
  • config_enableBottomSystemBar
  • config_enableRightSystemBar

每個欄位都有已配置和未配置的狀態,可以透過覆蓋相應的佈局文件來自訂:

  • car_left_system_bar.xml
  • car_left_system_bar_unprovisioned.xml
  • car_system_bar.xml (底部導覽列的佈局)
  • car_system_bar_unprovisioned.xml
  • car_right_system_bar.xml
  • car_right_system_bar_unprovisioned.xml

這些佈局必須在頂層包含com.android.systemui.car.systembar.CarSystemBarView ,其中可以包含任何其他必要的視圖。可以使用com.android.systemui.car.systembar.CarSystemBarButton包含導覽列中的按鈕。

如果為給定使用者正確配置了設備,這些視圖會在CarSystemBar#createSystemBar中膨脹。

狀態列

將狀態列視為具有附加功能的導覽列。與導覽列不同,狀態列沒有用於停用它的標誌。您可以透過以下方式修改狀態列:

  • car_top_navigation_bar.xml
  • car_top_navigation_bar_unprovisioned.xml

這些佈局必須在頂層包含com.android.systemui.statusbar.car.CarNavigationBarView 。狀態列包含狀態圖示。若要變更圖標的大小,請使用比例因子統一縮放圖標,而不是指定特定大小。例如,在覆蓋檔案/overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml中,新增以下尺寸以使圖示大小加倍:

<resources>
    <!-- The amount by which to scale up the status bar icons.-->
    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item>
</resources>

狀態列位於一個特殊的視窗圖層中,該圖層還包括通知面板、使用者切換器、抬頭通知 (HUN) 和鍵盤保護裝置。這些的各種佈局包含在super_status_bar.xml中。

系統UI源碼變更

覆寫可能無法提供充分自訂系統 UI 行為所需的靈活性。

警報。對 Android 原始碼所做的更改很難在 Android 的後續版本中更新。我們強烈建議您擴充 Automotive System UI 程式碼,而不是直接修改程式碼。這樣,底層汽車系統 UI 原始碼就可以以最小的合併衝突進行升級,因為所有自訂都是透過已知的 API 表面實現的。

系統 UI 的大多數方面都可以透過這兩個入口點進行自訂:

  • config_statusBarComponent
  • config_systemUIFactoryComponent

例如,如果您建立一個名為com.android.systemui.statusbar.car.custom.CustomCarStatusBar的類,該類別擴展了CarStatusBar ,請更新config_statusBarComponent以指向此新元件。擴展此類可以自訂與系統列和通知邏輯相關的大多數元素。

同樣,您可以建立CustomCarSystemUIFactory並將其放置在config_systemUIFactoryComponent中。使用此類更新 VolumeUI 和鎖定畫面的功能。

自訂用戶切換和解鎖

以下資料介紹如何客製化使用者切換體驗。

學期描述
鍵盤鎖全螢幕對話框可防止與前台應用程式的意外互動。設定多個使用者時保護每個使用者的隱私。
載入對話框在使用者之間切換時顯示載入畫面。
鎖定畫面、保鑣請使用者輸入 PIN、圖案或密碼的螢幕。
使用者安卓用戶。
使用者選擇器裝置啟動時顯示的使用者選擇器畫面。
使用者切換器從 QuickSettings 切換畫面時顯示使用者切換器。

自訂使用者切換

鍵盤鎖和保鑣

在 Android Automotive OS 中,只有當使用者點擊鎖定畫面上的取消按鈕時,才會顯示帶有使用者選擇器的 Keyguard 畫面。鍵盤保護螢幕如下所示。

鍵盤保護螢幕

圖 1. 鍵盤保護螢幕

當使用者選擇用於解鎖裝置的隱私類型時,將顯示帶有彈跳器的鎖屏,如下所示。

鎖定畫面

圖 2.鎖定螢幕介面。

當門鎖設定為手動觸發開關機時,請使用下列指令:

adb shell input keyevent 26

使用者選擇器

當汽車系統 UI 狀態列和地圖中整合的裝置重新啟動時,將顯示使用者選擇器畫面。要了解更多信息,請參閱FullscreenUserSwitcher

加載螢幕

圖 3.使用者選擇器螢幕

此畫面的佈局可以在car_fullscreen_user_switcher.xml中自訂。

加載螢幕

每當切換使用者時,無論入口點為何,都會顯示載入畫面。例如,透過使用者選擇器或“設定”畫面。載入畫面是框架 System UI 的組成部分,並對應到名為CarUserSwitchingDialog的公共類別。有關範例,請參見上面的圖 3。

可以使用Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog自訂主題。

為了設定 Android 用戶,初始設定精靈流程使驅動程式能夠為自己設定使用者名稱。如果驅動程式隨後將 Android 用戶與 Google 帳戶關聯,則會從該帳戶中選擇使用者名稱。但是,如果驅動程式指定了名稱(例如 DriverB),然後將該使用者名稱與名稱為 Maddy 的 Google 帳戶相關聯,則最初指派的名稱 (DriverB) 不會更改,因為名稱已明確設定。驅動程式只能在“設定”選單上更改名稱。

版面配置可以在car_user_switching_dialog.xml .

OEM 可以使用名為NoActionBar.Fullscreen的主題隱藏狀態列和導覽列。 (這是原始系統 UI,針對汽車參考 UI 進行了更新。)有關更多信息,請參閱自訂

雖然 OEM 可以提供用戶介面入口點來切換用戶,但結果有時可能並不理想。如果發生這種情況:

  1. OEM 建立並顯示自訂載入畫面(或對話方塊)。
    • 具體到UX,當使用者選擇切換方式時,OEM會啟動自訂載入畫面,當使用者切換完成時可以隱藏該畫面。
    • OEM 必須根據自己的偏好設定優先順序視窗。例如,較高優先順序的視窗類型。優先權不能超過Keyguard的優先權。
  2. OEM 在核心框架config.xml中設定config_customUserSwitchUi=true ,如config_customuserswitchui所述。因此,框架不會顯示CarUserSwitchingDialog

自訂鎖定畫面

鎖定畫面是系統 UI 的一個組成部分,可由 OEM 進行自訂。若要自訂流程,請從frameworks/base/packages/CarSystemUI/開始。

自訂首次用戶設定

設定嚮導執行首次使用者設定。這也可以客製。您可以使用UserManager API來建立使用者。在某些情況下,這可以在背景實現,從而簡化安裝精靈過程。