Consumir el estado de conducción del vehículo y las restricciones de UX

En esta página, se explica cómo las apps pueden realizar una transición fluida a la distracción de aplicaciones optimizadas (DO). Describe cómo consumir el estado de conducción de un automóvil, así como el las restricciones correspondientes de la experiencia del usuario. Para obtener más información sobre las restricciones de la experiencia del usuario (UX) del vehículo, consulta Restricciones para la Experiencia del Usuario del Vehículo, que detalla los tres estados de conducción: Estacionado, Inactivo y En movimiento.

Público

Este contenido está destinado a quienes desean diseñar aplicaciones que se adapten a los cambios el estado de conducción del vehículo y las restricciones de UX impuestas correspondientes.

Detalles técnicos

CarDrivingStateManager

El estado de conducción de un automóvil (Estacionado, En inactividad o En movimiento) se deriva de los valores de los sensores proporcionados por la capa de abstracción de hardware del vehículo (VHAL). La información básica del sensor, como la velocidad del vehículo y La selección actual de cambios se usa para obtener el estado de conducción actual del vehículo.

CarDrivingStateEvent.

que proporciona @SystemApis, lo que significa que solo componentes internos de la plataforma, APK en paquetes (como SysUI o Settings) y los APK con privilegios (como) GMSCore pueden acceder a las APIs. Las APIs están protegidas por permisos específicos del estado de conducción android.car.permission.CAR_DRIVING_STATE. Clientes que requieran acceso a la información del estado de conducción deben solicitar este permiso.

Administrador de restricciones de CarUx

Las apps en las que se muestra una interfaz de usuario que depende del estado de conducción deben escuchar CarUxRestrictionsManager, que abstrae la asignación del estado de conducción a las restricciones de UX para que las apps no necesiten ajustarse a diferentes requisitos de seguridad del mercado.

Nota: Estas actividades deben marcarse como optimización de distracciones, como se describe en los lineamientos sobre distracción del conductor. Si las actividades no se marcan como corresponde, se bloquearán.

En cambio, las apps supervisan las restricciones expuestas por CarUxRestrictionsManager y no por un el estado de conducción absoluto que expone CarDrivingStateManager para cualquier cosa relacionada con el usuario o la experiencia del usuario.

Muestra de código

En el siguiente código de ejemplo, se ilustra cómo una app supervisa las restricciones de UX:

  1. Importa los paquetes de la biblioteca de vehículos:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Implementa CarUxRestrictionManager.OnUxRestrictionsChangedListener. (mUxRChangeListener) Este objeto de escucha, cuando se registra con el Se llama a CarUxRestrictionsManager cuando se produce un cambio en las restricciones de UX. de que ocurra. Controla los cambios de restricción para optimizar las distracciones, según sea necesario:
    @Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
    private CarUxRestrictions mCurrentUxRestrictions;
    
    /* Implement the onUxRestrictionsChangedListener interface */
    private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
                new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
        {
            @Override
            public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
            mCurrentUxRestrictions = carUxRestrictions;
            /* Handle the new restrictions */
            handleUxRestrictionsChanged(carUxRestrictions);
            }
        };
      
  3. Llama a las APIs del vehículo para crear una instancia de automóvil llamada mCar y conéctate al servicio del vehículo:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Llama a mCar.getCarManager() - mCarUxRestrictionsManager para obtener la CarUxRestrictionsManager
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Para registrar el mUxRChangeListener implementado en el paso 2 anterior con el CarUxRestrictionsManager llama a mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

El bloque completo de código de muestra (creado desde el paso 3 hasta el paso 5) genera el objeto de escucha. recibir cambios de restricción cuando cambia el estado de conducción:

mCar = Car.createCar(context);
if (mCar == null) {
// handle car connection error
}

CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
mUxrChangeListener.onUxRestrictionsChanged(
mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Restricciones de CarUx

El objeto CarUxRestrictions proporciona dos tipos de información:

  1. ¿Existe algún requisito en la actualidad para optimizar las distracciones?
  2. Si es así, ¿qué restricciones se aplican actualmente?

Cuando CarUxRestrictions se obtiene de cualquiera de las siguientes propiedades: getCurrentUxRestrictions() o la devolución de llamada del objeto de escucha, las apps ahora pueden usar la API de isRequiresDistractionOptimization() para determinar si Optimizado es obligatorio. Si se muestra false, no es necesario que se muestre una distracción. están optimizadas y una app puede ejecutar cualquier actividad de forma segura.

Si se requiere optimización, usa la API de getActiveRestrictions() para obtener el conjunto de restricciones vigentes. Esta La API muestra un int, que es una máscara binaria de todas las restricciones actualmente vigentes. El conjunto de restricciones notificadas actualmente aparece en CarUxRestrictions.

Nota: Se prevén cambios menores en el conjunto de restricciones. que ocurrirá en un futuro cercano.

Por ejemplo, si una aplicación quiere determinar si existe una restricción para reproducir video, al cuando obtienes el objeto CarUxRestrictions, la app debe verificar la restricción:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

Estado de conducción

CarDrivingStateManager presenta el estado de conducción real del vehículo (estacionado, inactivo o En movimiento). Se puede llamar a las APIs de CarDrivingStateManager de manera similar a CarUxRestrictionsManager. Las apps pueden registrar un objeto de escucha u obtener el estado de conducción actual. El estado de conducción se devuelve como CarDrivingStateEvent.

CarDrivingStateEvent.

cambios, se llama al método onDrivingStateChanged() con el nuevo CarDrivingStateEvent

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       /* handle the state change accordingly */
       handleDrivingStateChange();
   }
};

Prueba

Puedes imitar el cambio de velocidad y de velocidad para modificar el estado de conducción. Cómo usar un shell de ADB para insertar eventos de vehículos. Esto puede ser útil durante el desarrollo y las pruebas.

Para simular eventos de conducción:

  1. Para establecer la velocidad en 0, haz lo siguiente:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Para establecer la marcha en estacionado (para simular CarDrivingStateEvent que apunta a PARKED), sigue estos pasos:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Para poner la marcha en Conducir, con la velocidad todavía en 0 (para simular CarDrivingStateEvent que apunta a IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. Para establecer la velocidad en 30 metros por segundo (para simular CarDrivingStateEvent que apunta a MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30