行车记录仪应用旨在与 AAOS 集成,为驾驶员提供视频录制功能,以增强安全性。本指南概述了技术要求、集成步骤和最佳实践,以确保成功实现。
前提条件
在继续之前,请确保满足以下前提条件:
SDK:
- 需要 SDK 31 或更高版本。
硬件:
- 可供 AAOS 使用的 EVS 或 Camera2 相机。
- 必须有足够的内部存储空间或支持可拆卸的外部存储空间
,才能录制视频。
软件要求:
- 不捆绑支持。如需了解详情,请参阅未捆绑应用。
- 权限。行车记录仪需要系统权限。
获取源代码
您可以在 Android 代码搜索中找到源代码,具体位置如下:
源代码在以下三个模块中提供:
- 行车记录仪服务。流式传输、录制和触发逻辑。
- 行车记录仪管理器。连接到行车记录仪服务,并向客户端公开稳定的 API
- 行车记录仪应用。使用 Dashcam Manager API 引用行车记录仪应用
构建行车记录仪
使用 Soong 或 Gradle 构建行车记录仪。
Soong
在通过 Soong 构建之前,请务必清理 .cxx
目录。
在 Soong 上:
mma DashcamService DashcamManager-lib DashcamApp
APK 位于 out/target/product/[lunch-target]/system/priv-app/
中
Gradle
在 Gradle 中:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
APK 位于 out/aaos-apps-gradle-build/
中
README
文件中提供了有关使用 Gradle 构建行车记录仪的详细说明。
权限
行车记录仪服务和行车记录仪应用需要多项系统权限。
授予这些权限的最简单方法是使用 Blueprint 或 Make 将其添加到预构建设置中。
在蓝图中:
Android.bp
android_app_import {
name: "DashcamApp-prebuilt",
apk: "DashcamApp.apk",
privileged: true,
certificate: "platform",
required: ["allowed_privapp_com.android.car.dashcam"],
}
在 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 \
创建一个名为 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>
将清单中的权限添加到权限文件中。
如需了解详情,请参阅预构建到系统映像。
旁加载
权限文件也可以旁加载。如果未配置预构建的车载摄像头,请使用此方法。
使用上一部分中创建的权限文件,运行以下命令:
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
配置叠加层
行车记录仪服务具有可叠加的配置。
服务配置
dashcam-service/res/values/config.xml
此文件包含该服务的配置:
allow_internal_storage
允许将录音保存到内部存储空间save_location
用于保存录音的目录名称。默认为 dashcammax_storage_mb
允许行车记录仪使用的存储空间大小max_age_days
在修剪之前保留文件的时长boot_startup_enabled
行车记录仪服务在设备启动时启动notifications_on
录制开始时显示通知native_recorder
使用 NDK API,默认为 Java APInative_renderer
使用 NDK API,默认为 Java APIdefault_app_component
默认的行车记录仪应用,此应用具有全局录制访问权限和全局触发器访问权限recording_module
IRecordingModule 实现的 ComponentNamestreaming_module
IRecordingModule 实现的 ComponentNametrigger_module
IRecordingModule 实现的 ComponentName
配置触发器
如需触发配置,请运行以下命令:
dashcam-service/src/assets/config.xml
此文件包含录制触发器的配置。触发器配置由两部分组成:
前贴片广告 ID。摄像头的 ID,即 EVS 或 Camera2,具体取决于支持的摄像头。
prerollLengthMs
要与每个事件一起存储的前贴片广告的时长。
<Preroll>
<Camera
ID="0"
prerollLengthMs="10000" />
</Preroll>
此示例显示了摄像头 ID 为 0 且预滚动时间为 10 秒。
name
唯一的触发器名称camera
相机 ID(EVS 或 Camera2,具体取决于支持的内容)sensorPropertyID
传感器的 IDdescription
界面中显示的触发器的说明recordingLengthMs
记录事件后的时间(以毫秒为单位)。sensorType
传感器的类型。选项为VHAL
或SENSOR_MANAGER
sensorValueType
传感器生成的数据类型。选项包括INT
、INT_ARRAY
、FLOAT
、FLOAT_ARRAY
和BOOLEAN, STRING
thresholdType
如何评估传感器值。选项包括AVERAGE
、BOOLEAN
、EQUALS
、LEAP
、LEAP_AVERAGE
、LEAP_OVER
、PEAK
和PEAK_HOLD
thresholdValue
与阈值类型一起用于比较传感器值的值thresholdExtra
某些阈值类型(例如AVERAGE
的范围)所需的额外值triggerCooldown
在触发另一个此类事件之前的冷却时间(以毫秒为单位)。
<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>
此示例展示了 VHAL 传感器生成整数值,我们将其与阈值进行比较。当满足等式条件时,触发器会在摄像头 1 和 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"/>
此示例显示了 VHAL 传感器生成浮点值,我们会根据阈值对一组样本的平均值进行评估。在 thresholdExtra
中设置了采样范围
模块
行车记录仪服务由三个模块组成:
Stream 包含用于处理来自摄像头的视频流的逻辑。
录制包含用于处理录制的逻辑。
Trigger 包含用于根据传感器数据触发录制的逻辑。模块 API 在其对应的接口
IStreamModule
、IRecorderModule
和ITriggerModule
中定义,并通过DashcamServiceAPI
公开给 DashcamManager
叠加层模块
行车记录仪服务使用 dashcam-service/res/values/config.xml
确定模块实现的位置。我们为每个模块提供默认实现。不过,您可以通过在相应的配置值中设置其组件来叠加每个模块。
将
IRecorderModule
的 OEM 实现组件名称设置为recording_module
将
IStreamModule
的 OEM 实现组件名称设置为流式传输模块。将
ITriggerModule
的 OEM 实现组件名称设置为trigger_module
在运行时,行车记录仪服务会为每个模块实例化在
config.xml
中设置的组件名称。
应用开发者指南
Dashcam 是一款可用于生产环境且可自定义的行车记录仪解决方案。行车记录仪使用 Dashcam Manager API 与 Dashcam service
通信。您可以在 IDashcamManager
中找到 Dashcam Manager API。具有所需权限的任何应用都可以使用行车记录仪管理器。
权限
支持 Camera2 和 EVS。
预构建
授予这些权限的最简单方法是使用 Blueprint 或 Make 将它们添加到预构建设置中。
OverlayUI
您可以使用运行时资源叠加层来自定义应用。如需了解详情,请参阅运行时资源叠加层。如需查看可叠加元素的列表,请参阅 overlayable.xml。
扩展触发器
您可以通过调用 DashcamManager.addTrigger()
为当前会话延长触发器的有效期。添加的触发器仅在当前会话期间有效。
自动启动
不支持自动开始录制。不过,您可以通过调用 DashcamManager.startRecording()
来启动手动触发器 onBoot
最佳做法
存储 - 强烈建议使用外部可移除存储设备。
用户体验。设计行车记录仪应用的界面,使其直观易用,并遵循 AAOS 设计准则。
效果优化。优化应用的性能,以最大限度地减少资源用量并确保在 AAOS 中顺畅运行。
问题排查
摄像头连接问题。AAOS IVI 必须支持 EVS 或 Camera2,并且这些 API 必须可用。
存储空间错误。验证可用存储空间并管理录制内容。 强烈建议使用外部存储空间,因为使用内部存储空间可能会导致存储空间过早磨损。