汽車設置中的分心優化

提供分心優化 (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);
    }
}