Cómo integrar la Dashcam

La app de Dashcam se diseñó para integrarse con AAOS y proporcionar 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 versiones posteriores.

Hardware:

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

Requisitos de software:

  • Compatibilidad no agrupada. Para obtener más información, consulta Apps no agrupadas.
  • Permisos. Dashcam requiere permisos del sistema.

Obtén el código fuente

Dashcam forma parte de las apps no agrupadas de AAOS. Para consultar el código no agrupado, consulta Cómo consultar el código.

Navega por el código fuente con Android Code Search.

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 Dashcam. Se conecta al servicio de Dashcam y expone una API estable a los clientes
  • App de Dashcam. Referencia a la aplicación de Dashcam con la API de Dashcam Manager

Diagrama de arquitectura

Compila Dashcam

Usa Soong o Gradle para compilar Dashcam.

Soong

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 Dashcam con Gradle.

Permisos

Se requieren varios permisos del sistema para el servicio de Dashcam y la app de Dashcam.

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"],
}

prebuilt_etc {
    name: "allowed_privapp_com.android.car.dashcam",
    sub_dir: "default-permissions",
    src: "allowed_privapp_com.android.car.dashcam.xml",
    filename_from_src: true,
}

En Make:

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/Dashcam/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.service">
      <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.

Antes de usar Dashcam, otorga previamente permisos de Camera2 al servicio de Dashcam como se muestra en la cámara de AAOS.

Agrega el archivo de permisos otorgados previamente al archivo Blueprint o Make de la misma manera que el archivo de permisos.

En pre-grant-permissions-com.android.car.dashcam.xml:

<exceptions>
    <exception package="com.android.car.dashcam.service">
        <permission name="android.permission.CAMERA" fixed="false" />
        <permission name="android.permission.SYSTEM_CAMERA" fixed="false" />
        <permission name="android.permission.CAMERA_HEADLESS_SYSTEM_USER" fixed="false" />
    </exception>
</exceptions>

En Android.bp:

...
required["pre-grant-permissions-com.android.car.dashcaml"]
...

prebuilt_etc {
    name: "pre-grant-permissions-com.android.car.dashcaml",
    sub_dir: "default-permissions",
    src: "pre-grant-permissions-com.android.car.dashcam.xml",
    filename_from_src: true,
}

Para obtener más información, consulta Cómo integrar una compilación previa en una imagen del sistema y Cómo agregar una lista de entidades permitidas.

Carga lateral

El archivo de permisos también se puede cargar de forma lateral. Usa este método cuando no esté configurada la Dashcam precompilada.

Con el archivo de permisos creado anteriormente en la sección de compilaciones previas, 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

Agrega el archivo de permisos otorgados previamente de manera similar a etc/default-permissions/.

Configura superposiciones

El servicio de Dashcam tiene configuraciones superponibles.

Configuración del servicio

dashcam-service/res/values/config.xml

Este archivo contiene configuraciones para el servicio:

  • config_file El nombre del archivo de configuración del activador en /assets
  • allow_internal_storage Permite que las grabaciones se guarden en el almacenamiento interno
  • boot_startup_enabled Inicio del servicio de Dashcam en el arranque del dispositivo
  • notifications_on Muestra notificaciones cuando comienza la grabación
  • default_app_component La app de Dashcam predeterminada, que tiene acceso global a las grabaciones y acceso global al activador
  • recording_module ComponentName de la implementación de IRecordingModule
  • streaming_module ComponentName de la implementación de IStreamingModule
  • trigger_module ComponentName de la implementación de ITriggerModule

Configuración del activador

Para configurar los activadores de grabación, crea una copia de:

dashcam-service/src/assets/config.xml

y agrégala al directorio de recursos. Apunta a este archivo en el elemento config_file del archivo de configuración del servicio.

La configuración del activador consta de partes de almacenamiento, cámara y activador:

Almacenamiento

La configuración de almacenamiento tiene los siguientes elementos:

  • maxStorageUsagePercent Porcentaje máximo de almacenamiento disponible que usa la Dashcam antes de podar las grabaciones

  • maxStorageUsageMegabytes Cantidad máxima de almacenamiento en megabytes que usa la Dashcam antes de podar las grabaciones

  • maxAgeHoursBeforePrune Cantidad máxima de horas antes de que se pode una grabación (se puede podar una grabación antes si se cumplen los límites de almacenamiento)

Cámara

La configuración de la cámara tiene los siguientes elementos:

  • ID de la cámara. Es el ID de la cámara con el prefijo de la cámara.

  • prerollLengthMs Duración del preroll que se almacenará con cada evento

  • width Ancho opcional del búfer que devuelve la cámara

  • height Altura opcional del búfer que devuelve la cámara

<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>

En este ejemplo, se muestra el ID de cámara EVS:1 con un preroll de 10 segundos a 1080p y el ID de cámara Camera2:1 con un preroll de 10 segundos y ancho y altura predeterminados.

Activador

La configuración del activador consta de una lista de activadores definidos por lo siguiente:

  • name El nombre único del activador

  • cameras IDs de las cámaras

  • sensorPropertyID ID del sensor con el prefijo del grupo de sensores (las opciones de prefijo son VHAL o SENSOR_MANAGER)

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

  • recordingLengthMs Duración después del evento para grabar en milisegundos

  • 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 en comparación con el thresholdValue (las opciones son AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK y PEAK_HOLD)

  • thresholdValue El valor comparado con el valor del sensor

  • thresholdExtra Valor adicional necesario para algunos tipos de umbral, como el rango de AVERAGE

  • triggerCooldown Enfriamiento en milisegundos antes de activar otro evento de este tipo

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

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

<EventTrigger
            name="SPEED"
            cameras="Camera2:0, Camera2:1,  Camera2:2,  Camera2:3"
            sensorPropertyID="VHAL:291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="10"
            triggerCooldown="2000"/>

En este ejemplo, se muestra un activador en el que TriggerModule supervisa un sensor VHAL que produce valores flotantes. TriggerModule compara el promedio del sensor en un rango de 10 muestras con el valor de umbral de 20.0. El rango de muestra se establece en thresholdExtra. Solo se puede activar un evento nuevo cada 2000 milisegundos, como se establece en triggerCooldown.

Módulos

El servicio de Dashcam 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 de superposición

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

Establece el nombre del componente de implementación del OEM de lo siguiente:

  • IRecorderModule a recording_module
  • De IStreamModule a streaming_module
  • ITriggerModule a trigger_module

En el tiempo de ejecución, el servicio de Dashcam 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 dashcam lista para producción y personalizable. Dashcam usa las APIs de Dashcam Manager para comunicarse con Dashcam service. La API de Dashcam Manager se puede encontrar en IDashcamManager. Cualquier app con los permisos necesarios puede usar Dashcam Manager.

OverlayUI

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

Extiende los activadores

Los activadores se pueden extender para la sesión actual con una llamada a DashcamManager#addTrigger(). Los activadores agregados persisten solo 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 el 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, según 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 sin problemas en AAOS.

Solución de problemas

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

  • Errores de almacenamiento. Verifica el espacio de almacenamiento disponible y administra las grabaciones. Se recomienda el almacenamiento externo, ya que el uso del almacenamiento interno puede provocar que se agote prematuramente.