En esta página, se explica cómo las apps pueden realizar una transición fluida a interfaces de usuario optimizadas para evitar distracciones (DO). En ella, se describe cómo consumir el estado de conducción de un automóvil, así como las restricciones de experiencia del usuario correspondientes. Para obtener más información sobre las restricciones de la experiencia del usuario (UX) del vehículo, consulta Restricciones de la experiencia del usuario del vehículo, en la que se detallan los tres estados de conducción: estacionado, en ralentí y en movimiento.
Público
Este contenido se proporciona para quienes deseen diseñar apps que se adapten a los cambios en el estado de conducción de un automóvil y las restricciones de UX impuestas de manera correspondiente.
Detalles técnicos
CarDrivingStateManager
El estado de conducción de un automóvil (estacionado, en ralentí o en movimiento) se deriva de los valores de los sensores que proporciona la capa de abstracción de hardware del vehículo (VHAL). La información básica de los sensores, como la velocidad del vehículo y la selección de la marcha actual, se usa para obtener el estado de conducción actual del vehículo.
CarDrivingStateEvent
.
que proporciona @SystemApis, lo que significa que solo los elementos internos de la plataforma, los APKs empaquetados (como SysUI o Configuración) y los APKs 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
. Los clientes que requieran acceso a la información del estado de conducción deben solicitar este permiso.
CarUxRestrictionsManager
Las apps que muestran una interfaz de usuario que depende del estado de conducción deben escuchar a CarUxRestrictionsManager
, que abstrae la asignación del estado de conducción a las restricciones de la UX para que las apps no deban adaptarse a los diferentes requisitos de seguridad del mercado.
Nota: Estas actividades deben marcarse como optimizadas para evitar distracciones, como se describe en los Lineamientos de distracciones del conductor. Si las actividades no se marcan según corresponda, se bloquearán.
En cambio, las apps supervisan las restricciones que expone CarUxRestrictionsManager y no un estado de conducción absoluto que expone CarDrivingStateManager para todo lo relacionado con la interfaz de usuario o la experiencia del usuario.
Muestra de código
En el siguiente código de muestra, se muestra cómo una app supervisa las restricciones de la UX:
- 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;
- Implementa
CarUxRestrictionManager.OnUxRestrictionsChangedListener
(mUxRChangeListener
). Cuando se registra con CarUxRestrictionsManager, se llama a este objeto de escucha cuando se produce un cambio en las restricciones de la UX. Controla los cambios de restricción para que se optimicen 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); } };
- Llama a las APIs de Car para crear una instancia de automóvil llamada mCar y conéctate al servicio de automóvil:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- Llama a
mCar.getCarManager() - mCarUxRestrictionsManager
para obtener elCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Para registrar
mUxRChangeListener
implementado en el paso 2 anterior con la llamadaCarUxRestrictionsManager
mCarUxRestrictionsManager.registerListener()
:mCarUxRestrictionsManager.registerListener(mUxrChangeListener); mUxrChangeListener.onUxRestrictionsChanged( mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
El bloque completo de código de muestra (creado en los pasos 3 a 5) hace que el objeto de escucha reciba cambios de restricción cuando cambia el estado de la unidad:
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());
CarUxRestrictions
El objeto CarUxRestrictions proporciona dos tipos de información:
- ¿Hay un requisito actual para que se optimice la distracción?
- Si es así, ¿qué restricciones existen actualmente?
Cuando se obtiene CarUxRestrictions de getCurrentUxRestrictions()
o la devolución de llamada del objeto de escucha, las apps ahora pueden usar la API de isRequiresDistractionOptimization()
para determinar si se requiere la optimización de distracciones. Si muestra false
, no es necesario que esté optimizada para distracciones, y una app puede ejecutar cualquier actividad de forma segura.
Si se requiere la optimización, usa la API de getActiveRestrictions() para obtener el conjunto de restricciones existentes. Esta API muestra un int, que es una máscara de bits de todas las restricciones vigentes. El conjunto de restricciones notificadas actualmente se indica en CarUxRestrictions
.
Nota: Se prevé que en un futuro cercano se realicen cambios menores en el conjunto de restricciones.
Por ejemplo, si una app quiere determinar si existe una restricción para reproducir videos, cuando obtiene el objeto CarUxRestrictions, la app debe verificar la restricción:
int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions(); if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) { handleStopPlayingVideo(); }
DrivingState
CarDrivingStateManager presenta el estado de conducción real del vehículo (estacionado, en ralentí o en movimiento). Se puede llamar a las APIs de CarDrivingStateManager de manera similar a CarUxRestrictionsManager. Las apps pueden registrar un objeto de escucha o obtener el estado de conducción actual. El estado de conducción se muestra como CarDrivingStateEvent.
CarDrivingStateEvent
.
cambia, 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 velocidades y la velocidad para cambiar el estado de conducción. Usa un comando de shell de ADB para insertar eventos del vehículo. Esto puede ser útil para el desarrollo y las pruebas.
Para simular eventos de conducción, haz lo siguiente:
- Para establecer la velocidad en 0, haz lo siguiente:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- Para establecer la marcha en estacionamiento (para simular que CarDrivingStateEvent apunta a PARKED), haz lo siguiente:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- Para establecer la marcha en Drive, con la velocidad en 0 (para simular que CarDrivingStateEvent apunta a IDLING), haz lo siguiente:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- Para establecer la velocidad en 30 metros por segundo (para simular que CarDrivingStateEvent apunta a MOVING), haz lo siguiente:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30