Restricciones de la experiencia del usuario del automóvil

Antes de continuar, revise las Pautas sobre distracciones al conducir .

Esta página describe las reglas de Restricciones de experiencia del usuario (UX) del automóvil que puede usar para crear múltiples configuraciones de reglas de Restricciones de UX (por ejemplo, Unión Europea versus Japón) y luego determinar qué conjunto de reglas aplicar en tiempo de ejecución. Para obtener más información, consulte Restricciones de CarUx .

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), el desarrollador puede usar la API para definir la nueva configuración.

La API para establecer la configuración persiste solo en la nueva configuración. En otras palabras, la configuración no surte efecto inmediatamente. En cambio, la nueva configuración se carga cuando el servicio de Restricciones de UX se reinicia y el automóvil está estacionado. El servicio de coche se asegura de que el coche esté aparcado antes de recargar la nueva configuración.

Además del nuevo método de servicio de restricciones de UX, se proporcionan API para construir la configuración. El estado de selección de marcha y velocidad se convierte a uno de tres estados de conducción:

  • Estacionado. Equipo en el parque.
  • De marcha en vacío. La marcha no está en estacionamiento y la velocidad es cero.
  • Moviente. La marcha no está en estacionamiento y la velocidad no es cero.

Para saber cómo las aplicaciones consumen el estado de conducción de un automóvil y las restricciones de UX correspondientes, consulte Consumo del estado de conducción del automóvil y restricciones de UX .

Configuración de restricciones basada en los estados de la unidad

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. Irrestricto.
  • De marcha en vacío. Sin vídeo ni pantalla de configuración.
  • Moviente. Totalmente restringido (se requieren todas las restricciones).

El mapeo ilustrado arriba está predeterminado y configurado como un recurso XML. El /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java luego 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 múltiples pantallas

De forma predeterminada, no se aplican restricciones a pantallas adicionales. Para crear configuraciones de restricción para varias pantallas, incluya la etiqueta RestrictionMapping con el puerto físico para esa pantalla. Las restricciones apropiadas se aplican automáticamente a cada pantalla. En el siguiente ejemplo, las pantallas con ID 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>

Configuraciones para modos de restricción

Puede seleccionar cualquier nombre para el modo, como adolescente . En el siguiente ejemplo, se configuran diferentes restricciones para los modos predeterminado y de pasajero (anteriormente, solo se admitía el modo de pasajero ):

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
Puede utilizar la API para establecer cualquier nombre de cadena para el modo. Por ejemplo, el método setRestrictionMode(@NonNull String mode) en CarUxRestrictionsManager. (Anteriormente, usaba el método setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) en CarUxRestrictionsManager).

CarUxRestrictionsAPI de configuración

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 tras la compilación().

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

Configure CarUxRestrictionsConfiguration para la siguiente unidad con CarUxRestrictionsManager . Este método requiere permiso, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION .

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Conservar una nueva configuración de restricciones de UX

Cuando se pasa una nueva configuración, el servicio de Restricciones de UX devuelve un valor booleano para indicar si la nueva configuración se ha guardado correctamente. Esta nueva configuración solo se utiliza cuando la unidad principal integrada (IHU) se reinicia y el automóvil está estacionado. Internamente, el servicio Restricciones de UX 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 al iniciarse.
  • Escenificado. También es opcional, esta configuración no tiene ningún efecto sobre las restricciones de UX y se promueve a producción cuando comienza el servicio del automóvil y cuando el automóvil está estacionado.

Configuración de producción

Figura 1. Configuración de producción

Abordar fallas

Hasta que se reciba información sobre el estado de conducción de CarPropertyManager (por ejemplo, durante el arranque), 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, resultados de ConfiguraciónNotFoundException), el servicio de Restricciones de UX vuelve al modo codificado y totalmente restringido:

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

Estado de conducción y restricciones de usuario

El siguiente contenido describe las interacciones que se muestran en el siguiente diagrama de diseño:

Impulsando las interacciones entre estados

Figura 2. Interacciones entre estados impulsores

Propiedades utilizadas para derivar el estado de conducción.

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

API disponibles para aplicaciones

El código reside en las siguientes ubicaciones:

Código Ubicación
CarUxRestrictionsManager
API públicas para registrarse para cambios de restricciones de 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
API del sistema para registrarse para impulsar cambios de estado.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de conducción, consulte Pruebas .