Restricciones para la experiencia del usuario de vehículo

Antes de continuar, revisa los Lineamientos sobre distracciones mientras se conduce.

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

El servicio de restricciones de UX de vehículos permite a los desarrolladores definir una nueva configuración de restricciones de UX de vehículos. 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 su lugar, la configuración nueva se carga cuando se reinicia el servicio de restricciones de UX y el vehículo está en modo de estacionamiento. El servicio del automóvil se asegura de que el automóvil esté en modo de estacionamiento antes de volver a cargar la nueva configuración.

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

  • Estacionado. Equipo en el parque.
  • Inactivo: La velocidad es cero y la transmisión no está en P.
  • Mudanza. La marcha no está en P 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 Cómo consumir el estado de conducción de un automóvil y las 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/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Estacionado. Sin restricciones.
  • Inactivo: No hay video ni pantalla de configuración.
  • Mudanza. Restricción general (se requieren todas las restricciones).

La asignación que se muestra anteriormente está predeterminada y configurada como un recurso XML. Luego, /packages/services/Car/+/main/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 physicalPort de esa pantalla. Las restricciones adecuadas se aplican automáticamente a cada visualización. En el siguiente ejemplo, las pantallas con los IDs de puerto físico 1 y 2 tienen configuraciones diferentes:

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

Parámetros de configuración 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, usabas 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 durante 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 siguiente viaje con CarUxRestrictionsManager. Este método requiere el permiso Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Cómo conservar una nueva configuración de restricciones de UX

Cuando se pasa una configuración nueva, el servicio de restricciones de UX muestra 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. De forma interna, el servicio de restricciones de UX contiene dos conjuntos de parámetros de configuración:

  • 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 etapa. Esta configuración, que también es opcional, no tiene efecto en las restricciones de UX y se promueve a producción cuando se inicia el servicio del vehículo y cuando está estacionado.

Configuración de producción

Figura 1: Configuración de producción

Fallas de direcciones

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 la lectura de una configuración guardada falla (por ejemplo, los resultados de SettingNotFoundException), el servicio de restricciones de UX recurre al modo completamente restringido y codificado:

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

Estado de conducción y restricciones para los usuarios

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 reside en las siguientes ubicaciones:

Código Ubicación
CarUxRestrictionsManager
Son APIs públicas para registrarse en los cambios de restricción de la UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Definición de restricciones de UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
APIs del sistema para registrarse y realizar cambios de estado de conducción.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de conducción, consulta Pruebas.