提供分心優化 (DO)作為一種工具,可減少駕駛員在汽車行駛時與“設置”應用程序的交互。由於駕駛時可能需要更改某些設置,因此該應用程序並未完全阻止。但是,默認情況下,大多數首選項都被禁用,僅啟用關鍵且易於更新的首選項。

圖 1.駕駛時啟用的應用程序
如果沒有優化分散注意力,也可以阻止整個活動,如下所示。此方法目前主要用於設置搜索。

圖 2.所有活動被阻止
可以通過配置覆蓋來完成對 DO 性能的基本定制。如果您需要更細粒度的自定義,可以通過代碼進行其他更改。
高級定制
如果在駕駛時禁用首選項,點擊它會顯示一條提示消息,說明該首選項在駕駛時不可用,前提是該首選項附加了一個首選項控制器。該消息使用restricted_while_driving字符串,可以使用覆蓋進行自定義(前提是該字符串少於60 個字符的限制)。

圖 3.自定義覆蓋
可以使用config_always_ignore_ux_restrictions禁用整個 DO 框架。將此設置為 true 意味著驅動程序可以與設置應用程序的各個方面進行交互。
<bool name="config_always_ignore_ux_restrictions">true</bool>
如果上述配置設置為 false,則設置應用程序會退回到config_ignore_ux_restrictions以確定在駕駛時應啟用哪些首選項。此處提供的字符串應指向preference_keys.xml.
例子
為了展示如何在駕駛時啟用深度嵌套設置,此示例演示瞭如何啟用文本轉語音 (TTS) 輸出設置。為此,請將層次結構中的所有設置添加到config_ignore_ux_restrictions 。這包括配置的系統、語言和輸入以及 TTS 首選項,因為我們的層次結構是 System->Languages & Input->Text-to-speech 輸出。但是,文本轉語音片段中的首選項仍將被禁用。要啟用它們,我們需要為我們希望訪問的首選項添加鍵。在此示例中,我們希望啟用播放首選項但不啟用引擎首選項,因此我們將 pk_tts_playback_group 添加到我們的配置中。
<string-array name="config_ignore_ux_restrictions">
[...]
<item>@string/pk_system_settings_entry</item>
<item>@string/pk_languages_and_input_settings</item>
<item>@string/pk_tts_settings_entry</item>
<item>@string/pk_tts_playback_group</item>
</string-array>
詳細定制
有一些偏好可能需要更多的定制行為,而不是簡單地基於駕駛狀態啟用/禁用偏好。例如,藍牙和 wifi 已被修改為在駕駛時顯示保存的藍牙設備或 wifi 接入點。
目前沒有基於配置的解決方案來進行這些調整。相反,您可以創建一個自定義類來擴展 PreferenceController 並覆蓋 onApplyUxRestrictions() 以進行所需的更改。
創建自定義首選項控制器後,您可以覆蓋相關的 XML 文件以將默認首選項控制器替換為您自己的實現。
例子
在 CarSettings 中,一些首選項具有這種更加自定義的行為,可以用作額外自定義的示例。例如,在Wi-Fi 接入點列表中,期望的行為是僅在駕駛時顯示已保存的接入點(並隱藏其餘接入點)。為此,請執行以下操作:
mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
? getCarWifiManager().getSavedAccessPoints()
: getCarWifiManager().getAllAccessPoints();
由於此處顯示的接入點已受到限制,因此您不希望對這些首選項應用額外UxRestrictions 。因此,覆蓋onApplyUxRestrictions並執行有意的無操作:
@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
// Since the list dynamically changes based on the ux restrictions, we
// enable this fragment regardless of the restriction. Intentional no-op.
}
藍牙綁定設備中提供了另一個示例。繼續啟用藍牙設備連接和斷開連接,但希望禁用訪問這些設備的其他設置的能力。為了實現這一點,我們再次覆蓋 onApplyUxRestrictions 但這次,如果NO_SETUP限制處於活動狀態,則隱藏首選項上的輔助操作。
@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
super.onApplyUxRestrictions(uxRestrictions);
if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
updateActionVisibility(getPreference(), /* isActionVisible= */ false);
}
}