行车记录仪应用旨在与 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 将其添加到预构建的设置中。
在 Blueprint 中:
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.service">
      <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用于保存录像的目录名称。默认为dashcam行车记录仪
- max_storage_mb允许行车记录仪使用的存储空间大小
- max_age_days保留文件多长时间后进行修剪
- boot_startup_enabled行车记录仪服务在设备启动时启动
- notifications_on录制开始时显示通知
- native_recorder使用 NDK API,默认为 Java API
- native_renderer使用 NDK API,默认为 Java API
- default_app_component默认行车记录仪应用,此应用具有全局录像访问权限和全局触发器访问权限
- recording_moduleIRecordingModule 实现的 ComponentName
- streaming_moduleIRecordingModule 实现的 ComponentName
- trigger_moduleIRecordingModule 实现的 ComponentName
配置触发器
如需触发配置,请运行以下命令:
dashcam-service/src/assets/config.xml
此文件包含录制触发器的配置。触发器配置由两部分组成:
- 前贴片广告 ID。摄像头的 ID,即 EVS 或 Camera2,具体取决于支持的类型。 
- prerollLengthMs与每个事件一起存储的前贴片广告的长度。
<Preroll>
  <Camera
      ID="0"
      prerollLengthMs="10000" />
</Preroll>
此示例显示了带有 10 秒前贴片广告的摄像头 ID 0。
- name唯一的触发器名称
- camera摄像头的 ID,即 EVS 或 Camera2,具体取决于支持的类型
- sensorPropertyID传感器的 ID
- description界面中显示的触发器的说明
- 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 包含用于处理摄像头视频流的逻辑。 
- Recording 包含用于处理录像的逻辑。 
- 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 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,并且必须提供 EVS 或 Camera2。 
- 存储空间错误。验证可用存储空间并管理录像。 强烈建议使用外部存储空间,因为使用内部存储空间可能会过早导致存储空间耗尽。 
