實現系統 UI

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

什麼是系統用戶界面?

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

零件描述
鎖屏界面用戶通過其驗證特定用戶帳戶的屏幕。
導航欄系統欄可以位於屏幕的左側、底部或右側,並且可以包括用於導航到不同應用程序、切換通知面板和提供車輛控制(例如 HVAC)的側面按鈕。這與提供返回、主頁和應用程序堆棧按鈕的 Android 系統 UI 實現不同。
狀態欄系統欄位於屏幕上,用作導航欄。狀態欄還提供支持以下功能的功能:
  • 連接圖標。包括藍牙、Wi-Fi 和熱點/移動連接。
  • 下拉通知面板。例如,從屏幕頂部向下滑動。
  • 抬頭通知 (HUN)。
系統界面指屏幕上顯示的不屬於應用程序的任何元素。
用戶切換器 UI用戶可以通過該屏幕選擇不同的用戶。
音量界面當驅動程序使用物理音量按鈕更改設備上的音量時顯示的對話框。

系統用戶界面如何工作?

系統 UI 是在設備開機時運行的 Android 應用程序。應用程序通過SystemServer的反射啟動。下面列出了系統 UI 的用戶可見方面最相關的入口點。使用這些組件自定義 Android 系統 UI 以實現特定於汽車的功能。

  • config_statusBarComponent
  • config_systemUIFactoryComponent

CarSystemUI 是 SystemUI 包的擴展,這意味著 SystemUI 包中的類和資源可以被 CarSystemUI 包使用和覆蓋。

自定義系統 UI

疊加層

雖然您可以修改 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 使用來自 SystemUICarSystemUI 包的資源,這意味著可以使用覆蓋覆蓋來自每個位置的資源,以影響汽車系統 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 (在 SystemUI 中,而不是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 版本中更新。強烈建議您擴展汽車系統 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 屏幕。 Keyguard 屏幕如下所示。

鍵盤保護屏幕

圖 1. Keyguard 屏幕

當用戶選擇了用於解鎖設備的隱私類型時,會顯示一個帶有保鏢的鎖屏,如下所示。

鎖屏

圖 2.鎖屏。

當鎖設置為手動觸發電源開啟或關閉時,使用以下指令:

adb shell input keyevent 26

用戶選擇器

當與汽車系統 UI 狀態欄和地圖集成的設備重新啟動時,將顯示用戶選擇器屏幕。要了解更多信息,請參閱FullscreenUserSwitcher

載入畫面

圖 3.加載屏幕

可以在car_fullscreen_user_switcher.xml中自定義此屏幕的佈局。

載入畫面

無論入口點如何,只要切換用戶,就會顯示加載屏幕。例如,通過用戶選擇器或設置屏幕。加載屏幕是框架系統 UI 的組成部分,並映射到名為CarUserSwitchingDialog的公共類。有關示例,請參見上面的圖 3。

可以使用Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog自定義主題。

要設置 Android 用戶,初始設置嚮導流程使驅動程序能夠為自己設置用戶名。如果驅動程序隨後將 Android 用戶與 Google 帳戶相關聯,則從該帳戶中選擇用戶名。但是,如果驅動程序指定了一個名稱,例如 DriverB,然後隨後將該用戶名與他們的 Google 帳戶關聯到具有 Maddy 的名稱,則最初分配的名稱 (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創建用戶。在某些情況下,這可以在後台實現,從而簡化設置嚮導過程。