汽車設定中的分心優化

分心優化 (DO)是一種工具,可在汽車行駛時減少駕駛員與「設定」應用程式的互動。駕駛時可能需要更改某些設置,因此該應用程式不會被完全阻止。但是,預設情況下,大多數首選項均已停用,僅啟用關鍵且易於更新的首選項。

駕駛時啟用的應用程式

圖 1.駕駛時啟用的應用程式

如果沒有對分散注意力進行最佳化,則整個活動也可能會被阻止,如下所示。該方法目前主要用於設定搜尋。

所有活動均被阻止

圖 2.所有活動均被阻止

DO 效能的基本客製化可以透過配置覆蓋來完成。如果您需要更細粒度的自訂,可以透過程式碼進行其他變更。

高級訂製

當駕駛時停用首選項時,點擊它會顯示一條 Toast 訊息,說明該首選項在駕駛時不可用,前提是該首選項附加了首選項控制器。該訊息使用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 首選項,因為我們的層次結構是系統 -> 語言和輸入 -> 文字轉語音輸出。但是,文字轉語音片段中的首選項仍然處於停用狀態。為了啟用它們,我們需要添加我們想要訪問的首選項的鍵。在此範例中,我們希望啟用播放首選項,但不啟用引擎首選項,因此我們將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>

詳細客製化

有些首選項可能需要更多的自訂行為,而不是簡單地根據駕駛狀態啟用/停用首選項。例如,藍牙和 Wi-Fi 已被修改為在駕駛時顯示已儲存的藍牙裝置或 Wi-Fi 存取點。

目前沒有基於配置的解決方案來進行此類調整。相反,您可以建立自訂類別來擴充 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);
    }
}