車輛使用者體驗限制

繼續操作前,請先詳閱行車分心守則

本頁面說明車輛使用者體驗 (UX) 限制規則,您可以使用這些規則建立多個 UX 限制規則設定 (例如歐盟與日本),然後在執行階段決定要套用哪一組規則。詳情請參閱 CarUxRestrictions

開發人員可透過車輛使用者體驗限制服務,定義新的車輛使用者體驗限制設定。如果開發人員想修改限制規則 (例如為了遵守當地安全標準),可以使用 API 定義新設定。

設定 API 只會保留在新設定中。換句話說,設定不會立即生效。而是在 UX Restrictions 服務重新啟動車輛處於停車狀態時,載入新設定。車輛服務會確保車輛處於停車狀態,再重新載入新設定。

除了新的 UX Restrictions 服務方法,API 也提供建構設定。檔位和速度狀態會轉換為下列三種駕駛狀態之一:

  • 已存放。排入停車檔。
  • 閒置。檔位不在停車檔,且車速為零。
  • 搬家:車輛未處於停車檔位,且車速不為零。

如要瞭解應用程式如何使用車輛的駕駛狀態和相應的使用者體驗限制,請參閱「使用車輛駕駛狀態和使用者體驗限制」。

根據行車狀態設定限制

為避免駕駛人分心,Android 會將駕駛狀態對應至一組使用者體驗限制 /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • 已存放。不受限制。
  • 閒置。沒有影片,也沒有設定畫面。
  • 搬家:全面禁用 (必須遵守所有限制)。

上圖所示的對應關係是預先決定,並設定為 XML 資源。然後將規則儲存在記憶體中。/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java接著,這項服務會將目前的行車狀態對應至使用者體驗限制,並將目前的限制廣播至整個系統。

<!-- 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 標記,並提供該螢幕的 physicalPort。系統會自動為每個螢幕套用適當的限制。在下列範例中,實體連接埠 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>

限制模式的設定

你可以為模式選取任何名稱,例如「青少年」。在下列範例中,系統為「預設」和「乘客」模式設定了不同的限制 (先前僅支援「乘客」模式):

<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) 方法)。

CarUxRestrictionsConfiguration 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

使用 CarUxRestrictionsManager 為下一個磁碟機設定 CarUxRestrictionsConfiguration。這個方法需要 Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION 權限。

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

保留新的使用者體驗限制設定

傳入新設定時,UX Restrictions 服務會傳回布林值,指出新設定是否已成功儲存。只有在車輛停妥時,整合式運算主機 (IHU) 重新啟動時,才會使用這項新設定。在內部,使用者體驗限制服務包含兩組設定:

  • 正式版:這項設定為選用,但通常會出現。使用者體驗限制服務會在啟動時讀取這項設定。
  • 分階段。這項設定也是選用項目,不會影響 UX 限制,且會在車輛服務啟動和車輛停妥時升級至正式版。

發布版本設定

圖 1. 發布版本設定

地址失敗

在收到 CarPropertyManager 的駕駛狀態資訊前 (例如啟動期間),系統不會強制執行 UX 限制。系統會假設駕駛狀態為「已停車」。

如果讀取已儲存的設定失敗 (例如產生 SettingNotFoundException),UX Restrictions 服務會改用硬式編碼的完全限制模式:

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

行車狀態和使用者限制

以下內容說明設計圖中顯示的互動:

駕駛狀態互動

圖 2. 駕駛狀態互動

用於衍生駕駛狀態的屬性

使用下列三種 VehiclePropertyIds 推導駕駛狀態:

應用程式可用的 API

程式碼位於下列位置:

程式碼 位置
CarUxRestrictionsManager
公開 API,用於註冊 UX 限制異動。
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
使用者體驗限制定義。
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
用於註冊駕駛狀態變更的系統 API。
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

如要模擬駕駛狀態,請參閱「測試」。