车载用户体验限制

在继续操作之前,请查看驾驶员分心指南

本页面介绍了车载用户体验 (UX) 限制规则,您可以使用这些规则创建多个用户体验限制规则配置(例如,欧盟与日本),然后确定在运行时应用哪一组规则。如需了解详情,请参阅CarUxRestrictions

车载用户体验限制服务让开发者能够定义新的车载用户体验限制配置。如果开发者想要修改限制规则(例如,为了遵守当地安全标准),可以使用 API 来定义新配置。

用于设置配置的 API 仅在新配置中保持不变。换句话说,配置不会立即生效。相反,仅当用户体验限制服务重启汽车处于驻车档时,新配置才会加载。汽车服务会确保汽车处于驻车档,然后再重新加载新配置。

除了新的用户体验限制服务方法之外,还提供了用于构建配置的 API。档位选择和速度状态会转换为以下三种驾驶状态之一

  • 已驻车。档位在驻车档。
  • 怠速。档位不在驻车档且速度为零。
  • 行驶中。档位不在驻车档且速度不为零。

要了解应用如何使用汽车的驾驶状态和相应的用户体验限制,请参阅使用车载驾驶状态和用户体验限制

基于驾驶状态的限制配置

为了防止驾驶员分心,Android 将驾驶状态映射到一组用户体验限制 /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • 已驻车。无限制。
  • 怠速。无视频且无配置屏幕。
  • 行驶中。完全受限(需要所有限制)。

上面所示的映射是预先确定的,并配置为 XML 资源。/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java 然后将规则保存在内存中。然后,该服务将当前驾驶状态映射到用户体验限制,并将当前限制广播到整个系统。

<!-- 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>

多个显示屏的配置

默认情况下,不会对其他显示屏应用任何限制。要为多个显示屏创建限制配置,请添加带有该显示屏 physicalPort 的 RestrictionMapping 标记。相应的限制会自动应用于每个显示屏。在以下示例中,physical Port 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。在以下示例中,为 defaultpassenger 模式配置了不同的限制(以前,仅支持 passenger 模式)

<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 配置架构的映射为 1:1。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) 重启且汽车处于驻车档时,才会使用此新配置。在内部,用户体验限制服务包含两组配置

  • 生产。虽然是可选的,但此配置通常存在。用户体验限制服务会在启动时读取此配置。
  • 暂存。此配置也是可选的,对用户体验限制没有影响,并且在汽车服务启动且汽车处于驻车档时,会升级为生产配置。

Production configuration

图 1. 生产配置

解决故障

在从 CarPropertyManager 收到驾驶状态信息之前(例如,在启动期间),不会强制执行用户体验限制。系统执行时就像驾驶状态为“已驻车”一样。

如果读取已保存的配置失败(例如,SettingNotFoundException 结果),则用户体验限制服务将回退到硬编码的完全受限模式

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

驾驶状态和用户限制

以下内容描述了以下设计图表中显示的互动

Driving state interactions

图 2. 驾驶状态互动

用于推导驾驶状态的属性

使用以下三个 VehiclePropertyIds 推导驾驶状态

应用可用的 API

代码位于以下位置

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

要模拟驾驶状态,请参阅测试