Restricciones para la experiencia del usuario de vehículo

Antes de continuar, revisa los Lineamientos sobre distracción al conducir.

En esta página, se describen las reglas de restricciones de la experiencia del usuario (UX) en el automóvil que puedes usar para crear varias configuraciones de reglas de restricciones de UX (por ejemplo, la Unión Europea frente a Japón) y, luego, determinar qué conjunto de reglas aplicar en el tiempo de ejecución. Para obtener más información, consulta CarUxRestrictions.

El servicio Car UX Restrictions permite a los desarrolladores definir una nueva configuración de Car UX Restrictions. Si un desarrollador desea modificar las reglas de restricción (por ejemplo, para cumplir con los estándares de seguridad locales), puede usar la API para definir la nueva configuración.

La API para establecer la configuración persiste solo en la configuración nueva. En otras palabras, la configuración no se aplica de inmediato. En cambio, la configuración nueva se carga cuando se reinicia el servicio de UX Restrictions y el automóvil está estacionado. El servicio de automóvil garantiza que el automóvil esté estacionado antes de volver a cargar la nueva configuración.

Además del nuevo método de servicio UX Restrictions, se proporcionan APIs para construir la configuración. El estado de la selección de marchas y la velocidad se convierten en uno de los tres estados de conducción:

  • Estacionado. La palanca de cambios está en la posición de estacionamiento.
  • Inactividad: La palanca de cambios no está en la posición de estacionamiento y la velocidad es cero.
  • En movimiento. La marcha no está en estacionamiento y la velocidad no es cero.

Para obtener información sobre cómo las apps consumen el estado de conducción de un automóvil y las restricciones de UX correspondientes, consulta Consumo del estado de conducción del automóvil y restricciones de UX.

Configuración de restricciones según los estados de conducción

Para evitar distracciones del conductor, Android asigna el estado de conducción a un conjunto de restricciones de UX./packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Estacionado. Sin restricciones.
  • Inactividad: No se muestra ningún video ni pantalla de configuración.
  • En movimiento. Restricción general (se requieren todas las restricciones)

La asignación ilustrada anteriormente está predeterminada y configurada como un recurso XML. Luego, /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java guarda las reglas en la memoria. Luego, el servicio asigna el estado de conducción actual a las restricciones de UX y transmite las restricciones actuales a todo el sistema.

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

Configuraciones para varias pantallas

De forma predeterminada, no se aplican restricciones a las pantallas adicionales. Para crear configuraciones de restricción para varias pantallas, incluye la etiqueta RestrictionMapping con el parámetro physicalPort para esa pantalla. Las restricciones adecuadas se aplican automáticamente a cada pantalla. En el siguiente ejemplo, las pantallas con IDs de puerto físicos 1 y 2 tienen diferentes configuraciones:

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

Configuraciones para los modos de restricción

Puedes seleccionar cualquier nombre para el modo, como adolescente. En el siguiente ejemplo, se configuran diferentes restricciones para los modos default y passenger (anteriormente, solo se admitía el modo 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>
Puedes usar la API para establecer cualquier nombre de cadena para el modo. Por ejemplo, el método setRestrictionMode(@NonNull String mode) en CarUxRestrictionsManager. (Anteriormente, se usaba el método setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) en CarUxRestrictionsManager).

APIs de CarUxRestrictionsConfiguration

Restricciones con CarUxRestrictionsConfiguration

La nueva clase CarUxRestrictionsConfiguration se asigna 1:1 al esquema de configuración XML actual. CarUxRestrictionsConfiguration se puede construir con CarUxRestrictions.Builder, que valida la configuración en 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();

API de CarUxRestrictionsManager

Establece CarUxRestrictionsConfiguration para el próximo viaje con CarUxRestrictionsManager. Este método requiere el permiso Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Persiste una nueva configuración de restricciones de UX

Cuando se pasa una configuración nueva, el servicio de Restricciones de UX devuelve un valor booleano para indicar si la configuración nueva se guardó correctamente. Esta nueva configuración solo se usa cuando se reinicia la consola central integrada (IHU) y el automóvil está estacionado. Internamente, el servicio de UX Restrictions contiene dos conjuntos de configuraciones:

  • Producción. Si bien es opcional, esta configuración suele estar presente. El servicio de restricciones de UX lee esta configuración cuando se inicia.
  • En etapas. Esta configuración también es opcional, no tiene efecto en las restricciones de UX y se promueve a producción cuando se inicia el servicio del automóvil y cuando el automóvil está estacionado.

Configuración de producción

Figura 1: Configuración de producción

Fallas de dirección

Hasta que se reciba información del estado de conducción de CarPropertyManager (por ejemplo, durante el inicio), no se aplicarán las restricciones de UX. El sistema funciona como si el estado de conducción fuera Estacionado.

Si falla la lectura de una configuración guardada (por ejemplo, se genera SettingNotFoundException), el servicio de Restricciones de UX recurre al modo codificado de forma rígida y completamente restringido:

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

Estado de conducción y restricciones del usuario

En el siguiente contenido, se describen las interacciones que se muestran en el siguiente diagrama de diseño:

Interacciones con el estado de conducción

Figura 2: Interacciones con el estado de conducción

Propiedades que se usan para derivar el estado de conducción

Usa los siguientes tres VehiclePropertyIds para derivar el estado de conducción:

APIs disponibles para las apps

El código se encuentra en las siguientes ubicaciones:

Código Ubicación
CarUxRestrictionsManager
APIs públicas para registrar cambios en las restricciones de UX.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Es la definición de las restricciones de UX.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
APIs del sistema para registrar cambios en el estado de conducción.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de conducción, consulta Pruebas.