在繼續之前,請查看駕駛分心指南。
本文介紹汽車用戶體驗 (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
代碼位於以下位置:
要模擬駕駛狀態,請參閱測試。