汽車用戶體驗限制

在繼續之前,請查看駕駛分心指南

本文介紹汽車用戶體驗 (UX) 限制規則,您可以使用這些規則創建多個 UX 限制規則配置(例如,歐盟與日本),然後確定在運行時應用哪組規則。有關詳細信息,請參閱CarUxRestrictions

Car UX Restrictions 服務使開發人員能夠定義新的 Car UX Restrictions 配置。如果開發者想要修改限制規則(例如符合當地的安全標準),開發者可以使用 API 來定義新的配置。

用於設置配置的 API 僅保留在新配置中。也就是說,配置不會立即生效。相反,當 UX Restrictions 服務重新啟動並且汽車處於停車位時,會加載新配置。汽車服務確保汽車在重新加載新配置之前處於停放狀態。

除了新的 UX Restrictions 服務方法之外,還提供了 API 來構建配置。檔位選擇和速度狀態轉換為三種駕駛狀態之一:

  • 停車。公園裡的裝備。
  • 空轉。檔位不在駐車檔且速度為零。
  • 移動。檔位不在駐車檔且速度不為零。

要了解應用程序如何使用汽車的駕駛狀態和相應的 UX 限制,請參閱消耗汽車駕駛狀態和 UX 限制

基於驅動器狀態的限製配置

為了防止駕駛員分心,Android 將駕駛狀態映射到一組用戶體驗限制 (UX Restriction) 規則(有關限制列表,請參閱attrs.xml )。考慮以下示例規則:

  • 停車。不受限制。
  • 空轉。沒有視頻,也沒有配置屏幕。
  • 移動。完全受限(所有限制都是必需的)。

上面說明的映射是預先確定的並配置為 XML 資源。配置記錄在car_ux_restrictions_map中。在內部, CarUxRestrictionsManagerService在初始化期間解析規則,然後將規則保存在內存中。然後,該服務將當前駕駛狀態映射到 UX Restrictions 並將當前限制廣播到整個系統。

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

多顯示器的配置

默認情況下,不會對其他顯示應用任何限制。要為多個顯示器創建限製配置,請在該顯示器的物理端口中包含RestrictionMapping標籤。適當的限制會自動應用於每個顯示器。在以下示例中,物理端口 ID 為 1 和 2 的顯示器具有不同的配置:

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

限制模式的配置

您現在可以為模式選擇任何名稱,例如teen 。在以下示例中,為默認模式和乘客模式配置了不同的限制(以前,僅支持乘客模式:

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
您可以使用 API 為模式設置任何字符串名稱。例如 CarUxRestrictionsManager 中的setRestrictionMode(@NonNull String mode)方法。 (以前,您將在 CarUxRestrictionsManager 中使用setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode)方法)。

CarUxRestrictions 配置 API

CarUxRestrictionsConfiguration 的限制

新類CarUxRestrictionsConfiguration以 1:1 的比例映射到當前 XML 配置模式。 CarUxRestrictionsConfiguration可以使用CarUxRestrictions. Builder ,它在 build() 上驗證配置。

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

CarUxRestrictionsManager API

CarUxRestrictionsConfiguration為下一個驅動器設置CarUxRestrictionsManager 。此方法需要權限Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

保留新的 UX 限製配置

傳入新配置時,UX Restrictions 服務會返回一個布爾值以指示新配置是否已成功保存。這種新配置僅在集成主機 (IHU) 重新啟動且汽車停放時使用。在內部,UX Restrictions 服務包含兩組配置:

  • 生產。雖然是可選的,但此配置通常存在。 UX Restrictions 服務在啟動時會讀取此配置。
  • 上演。同樣可選,此配置對 UX Restrictions 沒有影響,並在汽車服務啟動和汽車停放時提升為 Production。

生產配置

圖 1.生產配置

解決故障

在從 CarPropertyManager 接收到駕駛狀態信息(例如,在啟動期間)之前,不會強制執行 UX 限制。系統將如同駕駛狀態為停車一樣執行。

如果讀取保存的配置失敗(例如 SettingNotFoundException 結果),UX Restrictions 服務將退回到硬編碼的完全受限模式:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

駕駛狀態和用戶限制

以下內容描述了以下設計圖中顯示的交互:

駕駛狀態交互

圖 2.駕駛狀態交互

用於導出駕駛狀態的屬性

使用以下三個VehiclePropertyIds導出駕駛狀態:

應用程序可用的 API

代碼位於以下位置:

代碼地點
CarUxRestrictionsManager
用於註冊 UX 限制更改的公共 API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
CarUxRestrictions
UX 限制定義。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
CarDrivingStateManager
用於註冊駕駛狀態更改的系統 API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

要模擬駕駛狀態,請參閱測試