请在阅读本文之前阅读驾车时防分心指南。
本文介绍了汽车用户体验 (UX) 限制规则,您可以根据这些规则创建多个用户体验限制规则配置(例如适用于欧盟和适用于日本的规则),然后确定在运行时应用哪些规则。如需了解详情,请参阅 CarUxRestrictions。
借助汽车用户体验限制服务,开发者可以定义新的汽车用户体验限制配置。如果开发者想要修改限制规则(例如,为了符合当地安全标准),可以使用 API 定义新配置。
用于设置配置的 API 仅保留在新配置中。也就是说,配置不会立即生效,而是在用户体验限制服务重启时和停车后加载。汽车服务在重新加载新配置之前会确保处于停车状态。
除了新的用户体验限制服务方法之外,我们还提供了用于构建配置的 API。挡位选择和汽车速度的状态会转换为以下三种驾车状态之一:
- 停车。挡位处于“停车”状态。
- 空闲。挡位未处于“停车”状态,且速度为零。
- 行驶。挡位未处于“停车”状态,且速度不为零。
如需了解应用如何使用驾车状态及相应的用户体验限制,请参阅使用驾车状态和用户体验限制。
基于驾驶状态的限制配置
为了防止驾驶员分心,Android 会将驾车状态映射到一组用户体验限制规则(如需查看限制列表,请参阅 attrs.xml)。请考虑以下示例规则:
- 停车:不受限制。
- 空闲:不显示视频和配置屏幕。
- 行驶:完全受限(需要实施所有限制)。
上述映射关系已预先确定且已配置为 XML 资源。配置会被记录在 car_ux_restrictions_map 中。在内部,CarUxRestrictionsManagerService 会在初始化期间解析规则,然后将解析后的规则保存到内存中。然后,该服务会将当前驾车状态映射到用户体验限制,并将当前限制广播到整个系统。
<!-- No restrictions when car is parked --> <DrivingState car:state="parked"> <Restrictions car:requiresDistractionOptimization="false" car:uxr="baseline"/> </DrivingState> <!-- Restrictions when car is idling --> <DrivingState car:state="idling"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video|no_config"/> </DrivingState> <!-- Restrictions for speed >= 0 m/s --> <DrivingState car:state="moving" car:minSpeed="0.0"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="fully_restricted"/> </DrivingState>
适用于多显示屏的配置
默认情况下,不会向其他显示屏应用任何限制。如需创建适用于多显示屏的限制配置,请为相应显示屏的物理端口添加 RestrictionMapping
标记。相应限制会自动应用于每个显示屏。以下示例中物理端口 ID 分别为 1 和 2 的显示屏采用的配置有所相同:
<RestrictionMapping car:physicalPort="1"> <DrivingState car:state="moving"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/> </DrivingState> </RestrictionMapping> <RestrictionMapping car:physicalPort="2"> <DrivingState car:state="moving"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/> </DrivingState> </RestrictionMapping>
适用于受限模式的配置
您现在可以为模式选择任意名称,例如“teen”。在以下示例中,为默认模式和乘客模式配置了不同的限制(先前仅支持乘客模式):
<DrivingState car:state="idling"> <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/> </DrivingState> </Restrictions>您可以使用 API 为相应模式设置任何字符串名称。例如,CarUxRestrictionsManager 中的
setRestrictionMode(@NonNull String mode)
方法。(以前您会使用 CarUxRestrictionsManager 中的 setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode)
方法)。
CarUxRestrictionsConfiguration API
CarUxRestrictionsConfiguration 的限制
新类 CarUxRestrictionsConfiguration
与当前 XML 配置架构一一映射。CarUxRestrictionsConfiguration
可通过 CarUxRestrictions.
进行构建,后者可在执行 build() 操作时验证配置。
new CarUxRestrictionsConfiguration.Builder() // Explicitly set restrictions for each driving state. .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED, /* requiresOptimization= */ false, /* restrictions= */ UX_RESTRICTIONS_BASELINE) .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING, true, UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP) .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING, true, UX_RESTRICTIONS_FULLY_RESTRICTED) // Set restriction parameters. .setMaxStringLength(int max) .setMaxCumulativeContentItems(int max) .setMaxContentDepth(int max) // Build a new CarUxRestrictionsConfiguration. .build();
CarUxRestrictionsManager API
使用 CarUxRestrictionsManager
为下次驾驶设置 CarUxRestrictionsConfiguration
。该方法需要 Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION
权限。
public synchronized boolean saveUxRestrictionsConfigurationForNextBoot( CarUxRestrictionsConfiguration config);
保留新的用户体验限制配置
传入新配置后,用户体验限制服务会返回一个布尔值,指示是否已成功保存新配置。仅在集成车机 (IHU) 重启时以及停车后使用新配置。在内部,用户体验限制服务包含以下两组配置:
- 正式版。尽管该配置是可选配置,但通常都会显示。用户体验限制服务会在启动时读取该配置。
- 预演版。该配置也是可选配置,不会对用户体验限制产生任何影响,且可在汽车服务启动时以及停车后升级到正式版。
图 1. 正式版配置
解决失败问题
在从 CarPropertyManager 收到驾车状态信息(例如,在启动中)之前,系统不会强制实施用户体验限制。系统会像处于“停车”驾车状态时一样运行。
如果读取保存的配置失败(例如,返回 SettingNotFoundException 结果),则用户体验限制服务会回退到经过硬编码的完全受限模式:
// Idling/moving state is fully restricted. private static CarUxRestrictionsConfiguration generateDefaultConfig() {}
驾车状态和用户限制
以下内容介绍了以下设计图中显示的交互:
图 2. 驾车状态交互
用于推导驾车状态的属性
使用以下三个 VehiclePropertyIds
推导驾车状态:
适用于应用的 API
代码位于以下位置:
如需模拟驾车状态,请参阅测试。