La app de Dashcam está diseñada para integrarse en AAOS y brindar 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
La cámara para el automóvil forma parte de las apps sin empaquetar de AAOS. Para consultar el código sin agrupar, consulta Cómo consultar el código.
Explora 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 la cámara para auto. 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
Cómo compilar Dashcam
Usa Soong o Gradle para compilar la cámara de salpicadero.
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 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"],
}
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 la Dashcam, otorga permisos de Camera2 al servicio de Dashcam, como se muestra en Cámara de AAOS.
Agrega el archivo de permisos otorgados de antemano 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.
Transferencia
El archivo de permisos también se puede transferir de forma lateral. Usa este método cuando la cámara para salpicadero precompilada no esté configurada.
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
Agrega el archivo de permisos previos a la concesión de manera similar a etc/default-permissions/
.
Configura superposiciones
El servicio de la 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:
config_file
Es 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 cuando se inicia el dispositivonotifications_on
Mostrar notificaciones cuando comienza la grabacióndefault_app_component
La app de cámara para auto predeterminada, que tiene acceso a grabaciones globales y a activadores globalesrecording_module
ComponentName de la implementación deIRecordingModule
streaming_module
ComponentName de la implementación deIStreamingModule
trigger_module
ComponentName de la implementación deITriggerModule
Configuración del activador
Para configurar los activadores de grabación, crea una copia de lo siguiente:
dashcam-service/src/assets/config.xml
y agrégalo al directorio de recursos. Dirige este archivo al elemento config_file
en el 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
Es el porcentaje máximo de almacenamiento disponible que usa la cámara para salpicadero antes de eliminar las grabaciones.maxStorageUsageMegabytes
Es la cantidad máxima de almacenamiento en megabytes que usa la cámara para salpicadero antes de eliminar las grabaciones.maxAgeHoursBeforePrune
Cantidad máxima de horas antes de que se elimine una grabación. Una grabación se puede eliminar 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
Es la duración del preroll que se almacenará con cada evento.width
Ancho opcional del búfer que muestra la cámara.height
Es la altura opcional del búfer que muestra 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 en 1080p y el ID de cámara Camera2:1 con un preroll de 10 segundos y un ancho y una altura predeterminados.
Activador
La configuración del activador consta de una lista de activadores definidos por lo siguiente:
name
Es el nombre único del activador.cameras
Los IDs de las cámarasID
sensorPropertyID
del sensor con el prefijo del grupo de sensores. Las opciones de prefijo sonVHAL
oSENSOR_MANAGER
.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.sensorValueType
Tipo de datos que produce el sensor. Las opciones sonINT
,INT_ARRAY
,FLOAT
,FLOAT_ARRAY
yBOOLEAN, STRING
.thresholdType
Cómo evaluar el valor del sensor en función dethresholdValue
Las opciones sonAVERAGE
,BOOLEAN
,EQUALS
,LEAP
,LEAP_AVERAGE
,LEAP_OVER
,PEAK
yPEAK_HOLD
.thresholdValue
Es el valor comparado con el valor del sensor.thresholdExtra
Es un valor adicional necesario para algunos tipos de umbrales, como el rango paraAVERAGE
.triggerCooldown
Tiempo de inactividad 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 de VHAL que produce valores enteros.
TriggerModule
compara la igualdad con el valor del umbral. Cuando se cumple la condición de igualdad, un activador
graba en las cámaras de 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 de VHAL que produce valores de número de punto flotante.
TriggerModule
compara el promedio del sensor en un rango de 10
muestras con el valor umbral de 20.0
.
El rango de muestra se establece en thresholdExtra
. Un evento nuevo solo se puede activar cada 2000
milisegundos, como se establece en triggerCooldown
.
Módulos
El servicio de cámara para salpicadero consta de tres módulos:
Transmisión 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
yITriggerModule
, y se exponen aDashcamManager
a través deDashcamServiceAPI
.
Módulos superpuestos
El servicio de la cámara para salpicadero usa dashcam-service/res/values/config.xml
para determinar dónde encontrar las implementaciones del módulo. Se proporcionan 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 lo siguiente:
- De
IRecorderModule
arecording_module
- De
IStreamModule
astreaming_module
- De
ITriggerModule
atrigger_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 salpicadero y personalizable lista para producción. La cámara de 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 Dashcam Manager.
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 persisten solo para la sesión actual.
Inicio automático
No se admite la grabación con 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.