Android Automotive 提供了專為車輛開發的新系統 UI。系統 UI 的大多數組件都與框架服務緊密耦合。系統 UI是指屏幕上顯示的任何不屬於應用程序的元素。 Automotive System UI(在 CarSystemUI 元素包中)是 Android System UI(在 SystemUI 包中)的擴展,專門為車輛定制。
什麼是系統用戶界面?
特定於汽車系統 UI 的組件包括:
零件 | 描述 |
---|---|
鎖屏界面 | 用戶通過其驗證特定用戶帳戶的屏幕。 |
導航欄 | 系統欄可以位於屏幕的左側、底部或右側,並且可以包括用於導航到不同應用程序、切換通知面板和提供車輛控制(例如 HVAC)的側面按鈕。這與提供返回、主頁和應用程序堆棧按鈕的 Android 系統 UI 實現不同。 |
狀態欄 | 系統欄位於屏幕上,用作導航欄。狀態欄還提供支持以下功能的功能:
|
系統界面 | 指屏幕上顯示的不屬於應用程序的任何元素。 |
用戶切換器 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 使用來自 SystemUI和CarSystemUI 包的資源,這意味著可以使用覆蓋覆蓋來自每個位置的資源,以影響汽車系統 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 可以提供用戶界面入口點來切換用戶,但結果有時可能並不理想。如果發生這種情況:
- OEM 創建並顯示自定義加載屏幕(或對話框)。
- 具體到UX,當用戶選擇切換方式時,OEM會啟動自定義加載屏幕,用戶切換完成後可以隱藏。
- OEM 必鬚根據自己的喜好設置優先窗口。例如,更高優先級的窗口類型。優先級不能超過 Keyguard 的優先級。
- OEM 在核心框架
config.xml
中設置config_customUserSwitchUi=true
,如config_customuserswitchui
中所述。因此,框架不顯示CarUserSwitchingDialog
。
自定義鎖屏
鎖屏是系統 UI 的一個組成部分,可由 OEM 定制。要自定義流程,請從frameworks/base/packages/CarSystemUI/
開始。
自定義首次用戶設置
設置嚮導執行首次用戶設置。這也可以定制。您可以使用UserManager API創建用戶。在某些情況下,這可以在後台實現,從而簡化設置嚮導過程。