Restricciones de la experiencia del usuario del automóvil

Antes de continuar, revise las Pautas de distracción al conducir .

En este artículo, se describen las reglas de restricciones de la experiencia del usuario (UX) del automóvil que puede 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 tiempo de ejecución. Para obtener más información, consulte CarUxRestrictions .

El servicio de Restricciones Car UX permite a los desarrolladores definir una nueva configuración de Restricciones Car UX. 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á en Estacionar. El servicio de automóviles se asegura de que el automóvil esté estacionado antes de volver a cargar 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 en uno de los tres estados de conducción:

  • estacionado Engranaje en el parque.
  • Ralentí . El engranaje no está en Park y la velocidad es cero.
  • Mudanza El engranaje no está en Park y la velocidad no es cero.

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

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

Para evitar la distracción del conductor, Android asigna el estado de conducción a un conjunto de reglas de Restricción de UX (Restricción de UX) (para obtener una lista de restricciones, consulte attrs.xml ). Considere estas reglas de muestra:

  • estacionado Irrestricto.
  • Ralentí . Sin video y sin pantalla de configuración.
  • Mudanza Totalmente restringido (se requieren todas las restricciones).

El mapeo ilustrado arriba está predeterminado y configurado como un recurso XML. La configuración se registra en car_ux_restrictions_map . Internamente, CarUxRestrictionsManagerService analiza las reglas durante la inicialización y luego las guarda 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 las pantallas adicionales. Para crear configuraciones de restricción para múltiples 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 los 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

Ahora 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 usar la API para establecer cualquier nombre de cadena para el modo. Por ejemplo, el setRestrictionMode(@NonNull String mode) en CarUxRestrictionsManager. (Anteriormente, usaría el 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 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

Establezca CarUxRestrictionsConfiguration para el próximo viaje 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 usa 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 cuando se inicia.
  • puesta en escena También es opcional, esta configuración no tiene efecto en las Restricciones de UX y se promueve a Producción cuando se inicia el servicio de automóvil y cuando el automóvil está estacionado.

Configuración de producción

Figura 1. Configuración de producción

Errores de dirección

Hasta que se reciba la información del estado de conducción de CarPropertyManager (por ejemplo, durante el arranque), no se aplicarán las Restricciones de UX. El sistema funcionará como si el estado de conducción estuviera estacionado.

Si falla la lectura de una configuración guardada (por ejemplo, los resultados de la excepción SettingNotFoundException), el servicio de Restricciones de UX vuelve al modo totalmente restringido y codificado de forma rígida:

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

Interacciones del estado de conducción

Figura 2. Interacciones del estado de conducción

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 restricción de UX.
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
CarUxRestrictions
Definición de restricciones de UX.
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
CarDrivingStateManager
API del sistema para registrarse para cambios de estado de conducción.
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de conducción, consulte Pruebas .