分心优化 (DO) 作为一种工具提供,旨在减少驾驶员在汽车行驶时与“设置”应用的交互。某些设置可能需要在驾驶时更改,因此该应用不会被完全阻止。但是,默认情况下,大多数偏好设置被禁用,只有关键且易于更新的偏好设置被启用。
图 1. 驾驶时启用的应用
如果整个 Activity 没有进行分心优化,也可能会被阻止,如下所示。此方法目前主要用于设置搜索。
图 2. 所有 Activity 被阻止
可以通过配置叠加层对 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 接入点列表中,所需的行为是在驾驶时仅显示已保存的接入点(并隐藏其余的)。要实现此目的,请执行以下操作
} 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); } }