車輛設定中的分心因素最佳化

分心程度最佳化 (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. 中定義的字串

範例

為了說明如何在開車時啟用深層巢狀設定,這個範例將示範如何啟用 Text-to-Speech (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 存取點清單中,您希望在行車時只顯示已儲存的存取點 (並隱藏其餘項目)。如要達成這一目標,請按照下列步驟操作:

} else if (shouldApplyUxRestrictions(getUxRestrictions())) {
    wifiEntries = getCarWifiManager().getSavedWifiEntries();
} else {
    wifiEntries = getCarWifiManager().getAllWifiEntries();
}

由於這裡顯示的存取點已設限,因此您不應將其他 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);
    }
}