分心程度最佳化 (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); } }