Cómo integrar la Dashcam

La app de Dashcam está diseñada para integrarse en AAOS y brindarles a los conductores capacidades de grabación de video para mejorar la seguridad. En esta guía, se describen los requisitos técnicos, los pasos de integración y las prácticas recomendadas para garantizar una implementación exitosa.

Requisitos previos

Antes de continuar, asegúrate de que se cumplan estas condiciones previas:

SDK:

  • Se requiere el SDK 31 o una versión posterior.

Hardware:

  • Cámaras EVS o Camera2 disponibles para AAOS
  • Debe haber suficiente espacio de almacenamiento interno o compatibilidad con almacenamiento externo extraíble
    para las grabaciones de video.

Requisitos de software:

  • Asistencia sin paquete. Para obtener más información, consulta Apps sin empaquetar.
  • Permisos. La cámara para el automóvil requiere permisos del sistema.

Obtén el código fuente

Busca el código fuente en Android Code Search en:

https://cs.android.com/android/platform/superproject/+/ub-automotive-master-20250219:packages/apps/Car/Dashcam/

El código fuente se proporciona en estos tres módulos:

  • Servicio de Dashcam Lógica de transmisión, grabación y activación.
  • Administrador de la cámara para salpicadero. Se conecta al servicio de la cámara para salpicadero y expone una API estable a los clientes.
  • App de Dashcam. Aplicación de referencia de Dashcam que usa la API de Dashcam Manager

Diagrama de la arquitectura

Cómo compilar Dashcam

Usa Soong o Gradle para compilar la cámara de salpicadero.

Soong

Antes de compilar desde Soong, asegúrate de limpiar los directorios .cxx.

En Soong:

mma DashcamService DashcamManager-lib DashcamApp

Los APKs se encuentran en out/target/product/[lunch-target]/system/priv-app/.

Gradle

En Gradle:

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

Los APKs se encuentran en out/aaos-apps-gradle-build/.

En el archivo README, se proporcionan instrucciones detalladas para compilar la cámara de salpicadero con Gradle.

Permisos

Se requieren varios permisos del sistema para el servicio y la app de la cámara para salpicadero.

La forma más sencilla de otorgar estos permisos es incluirlos en una configuración precompilada con Blueprint o Make.

En Blueprint:

Android.bp
android_app_import {
    name: "DashcamApp-prebuilt",
    apk: "DashcamApp.apk",
    privileged: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.dashcam"],
}

En Make:

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/CarCatApp/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \

Crea un archivo de permisos llamado allowed_privapp_com.android.car.dashcam.xml:

<permissions>
  <privapp-permissions package="com.android.car.dashcam">
      <permission name="" />
  </privapp-permissions>
  <privapp-permissions package="com.android.car.dashcam.app">
      <permission name="" />
  </privapp-permissions>
</permissions>

Agrega permisos del manifiesto al archivo de permisos.

Para obtener más información, consulta Precompilado en una imagen del sistema.

Transferencia

El archivo de permisos también se puede transferir de forma lateral. Usa este método cuando no esté configurada la cámara para salpicadero precompilada.

Con el archivo de permisos creado en la sección de compilaciones anteriores, ejecuta lo siguiente:

adb root
adb remount
adb push allowed_privapp_com.android.car.dashcam.xml /etc/permissions/allowed_privapp_com.android.car.dashcam.xml
adb shell chmod 644 /etc/permissions/allowed_privapp_com.android.car.dashcam.xml

Configura superposiciones

El servicio de cámara para salpicadero tiene configuraciones superpuestas.

Configuración del servicio

dashcam-service/res/values/config.xml

Este archivo contiene parámetros de configuración para el servicio:

  • allow_internal_storage Permite grabaciones en el almacenamiento interno
  • save_location Es el nombre del directorio en el que se guardarán las grabaciones. El valor predeterminado es cámara para salpicadero.
  • max_storage_mb Cuánto almacenamiento se le permite usar a la cámara para salpicadero
  • max_age_days Cuánto tiempo se retiene un archivo antes de la poda
  • boot_startup_enabled Inicio del servicio de la cámara para salpicadero al iniciar el dispositivo
  • notifications_on Mostrar notificaciones cuando comienza la grabación
  • native_recorder Usa las APIs de NDK, que se establecen de forma predeterminada en las APIs de Java.
  • native_renderer Usa las APIs de NDK, que se establecen de forma predeterminada en las APIs de Java.
  • default_app_component La aplicación predeterminada de la cámara para salpicadero, que tiene acceso a grabaciones globales y a activadores globales
  • recording_module ComponentName de la implementación de IRecordingModule
  • streaming_module ComponentName de la implementación de IRecordingModule
  • trigger_module ComponentName de la implementación de IRecordingModule

Configura un activador

Para activar la configuración, ejecuta lo siguiente:

dashcam-service/src/assets/config.xml

Este archivo contiene configuraciones para grabar activadores. La configuración del activador consta de dos partes:

  • ID del anuncio previo al video. El ID de la cámara, ya sea EVS o Camera2, según lo que se admita

  • prerollLengthMs Es la duración del anuncio previo que se almacenará con cada evento.

<Preroll>
  <Camera
      ID="0"
      prerollLengthMs="10000" />
</Preroll>

En este ejemplo, se muestra el ID de cámara 0 con un preroll de 10 segundos.

  • name El nombre único del activador

  • camera Es el ID de la cámara, ya sea EVS o Camera2, según lo que se admita.

  • sensorPropertyID ID del sensor

  • description Descripción del activador que se muestra en la IU

  • recordingLengthMs Es la duración después del evento que se debe grabar, expresada en milisegundos.

  • sensorType Qué tipo de sensor. Las opciones son VHAL o SENSOR_MANAGER.

  • sensorValueType Tipo de datos que produce el sensor. Las opciones son INT, INT_ARRAY, FLOAT, FLOAT_ARRAY y BOOLEAN, STRING.

  • thresholdType Cómo evaluar el valor del sensor Las opciones son AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK y PEAK_HOLD.

  • thresholdValue Es el valor con el que se compara el valor del sensor con el tipo de umbral.

  • thresholdExtra Es un valor adicional necesario para algunos tipos de umbrales, como el rango para AVERAGE.

  • triggerCooldown Tiempo de inactividad antes de activar otro evento de este tipo en milisegundos.

<EventTriggers>
  <EventTrigger
      name="AEB"
      camera="1 2"
      sensorPropertyID="289411073"
      description="Automatic Emergency Braking"
      recordingLengthMs="20000"
      sensorType="VHAL"
      sensorValueType="INT"
      thresholdType="EQUALS"
      thresholdValue="2"
      triggerCooldown="5000"/>
</EventTriggers>

En este ejemplo, se muestra un sensor de VHAL que produce valores enteros en los que comparamos una igualdad con el valor del umbral. Cuando se cumple la condición de igualdad, un activador graba en las cámaras 1 y 2.

<EventTrigger
            name="SPEED"
            camera="1 2 3 4"
            sensorPropertyID="291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorType="VHAL"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="1000"
            triggerCooldown="2000"/>

En este ejemplo, se muestra un sensor de VHAL que produce valores de punto flotante en los que evaluamos el promedio de un rango de muestras en función del valor del umbral. El rango de muestra se establece en thresholdExtra.

Módulos

El servicio de cámara para salpicadero consta de tres módulos:

  • Stream contiene la lógica para controlar las transmisiones de las cámaras.

  • Recording contiene la lógica para controlar las grabaciones.

  • Trigger contiene la lógica para activar una grabación a partir de los datos del sensor. Las APIs de los módulos se definen en sus interfaces correspondientes, IStreamModule, IRecorderModule y ITriggerModule, y se exponen a DashcamManager a través de DashcamServiceAPI.

Módulos superpuestos

El servicio de Dashcam usa dashcam-service/res/values/config.xml para determinar dónde encontrar las implementaciones de los módulos. Proporcionamos implementaciones predeterminadas para cada módulo. Sin embargo, cada módulo se puede superponer configurando su componente en el valor de configuración correspondiente.

  • Establece el nombre del componente de implementación del OEM de IRecorderModule como recording_module.

  • Establece el nombre del componente de implementación del OEM de IStreamModule en el módulo de transmisión.

  • Establece el nombre del componente de implementación del OEM de ITriggerModule como trigger_module.

    Durante el tiempo de ejecución, el servicio de la cámara para salpicadero crea una instancia del nombre del componente establecido en config.xml para cada módulo.

Guía para desarrolladores de apps

Dashcam es una solución de cámara para el tablero y personalizable lista para producción. La cámara para salpicadero usa las APIs de Dashcam Manager para comunicarse con Dashcam service. Puedes encontrar la API de Dashcam Manager en IDashcamManager. Cualquier app con los permisos necesarios puede usar el Administrador de cámaras para automóviles.

Permisos

Se admiten Camera2 y EVS.

Compilación previa

La forma más fácil de otorgar estos permisos es incluirlos en la configuración precompilada con Blueprint o Make.

OverlayUI

La app se puede personalizar con superposiciones de recursos del entorno de ejecución. Para obtener más información, consulta Superposiciones de recursos del entorno de ejecución. Para ver la lista de elementos superpuestos, consulta overlayable.xml.

Activadores extendidos

Los activadores se pueden extender para la sesión actual con una llamada a DashcamManager.addTrigger(). Los activadores agregados solo persisten para la sesión actual.

Inicio automático

No se admite la grabación de inicio automático. Sin embargo, se puede iniciar un activador manual onBoot con una llamada a DashcamManager.startRecording().

Prácticas recomendadas

  • Almacenamiento. Se recomienda usar almacenamiento externo extraíble.

  • Experiencia del usuario. Diseña la IU de la app de Dashcam para que sea intuitiva y fácil de usar, y cumple con los lineamientos de diseño de AAOS.

  • Optimización del rendimiento. Optimiza el rendimiento de la app para minimizar el uso de recursos y garantizar un funcionamiento fluido en AAOS.

Solución de problemas

  • Problemas de conectividad de la cámara EVS o Camera2 deben ser compatibles y estar disponibles en el IVI de AAOS.

  • Errores de almacenamiento. Verifica el espacio de almacenamiento disponible y administra las grabaciones. Se recomienda usar el almacenamiento externo, ya que el uso del almacenamiento interno puede hacer que se desgaste antes de tiempo.