汽车用户体验限制

请在阅读本文之前阅读驾车时防分心指南

本文介绍了汽车用户体验 (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.Builder 进行构建,后者可在执行 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

代码位于以下位置:

代码 位置
CarUxRestrictionsManager
用于注册用户体验限制更改的公共 API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
CarUxRestrictions
用户体验限制定义。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
CarDrivingStateManager
用于注册驾车状态更改的系统 API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

如需模拟驾车状态,请参阅测试