整合 Dashcam

Dashcam 應用程式可與 AAOS 整合,為駕駛人提供錄影功能,進一步提升安全保障。本指南將說明技術規定、整合步驟和最佳做法,確保導入作業順利完成。

必要條件

繼續操作前,請務必先完成下列工作:

SDK:

  • 需要 SDK 31 以上版本。

硬體:

  • AAOS 可用的 EVS 或 Camera2 攝影機。
  • 必須有足夠的內部儲存空間或支援可移除的外部儲存空間
    ,才能錄製影片。

軟體需求:

取得原始碼

行車記錄器是 AAOS 解除綁定應用程式之一。如要查看未綁定的代碼,請參閱「查看代碼」。

使用 Android 程式碼搜尋瀏覽原始碼。

原始碼位於下列三個模組中:

  • 行車記錄器服務。串流、錄製和觸發邏輯。
  • 行車記錄器管理員。連線至行車記錄器服務,並向用戶端公開穩定的 API
  • 行車記錄器應用程式:使用 Dashcam Manager API 參考行車記錄器應用程式

架構圖

建構 Dashcam

使用 Soong 或 Gradle 建構行車記錄器。

Soong

在 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/

如需使用 Gradle 建構 Dashcam 的詳細操作說明,請參閱 README 檔案。

權限

Dashcam 服務和 Dashcam 應用程式需要多項系統權限。

如要授予這些權限,最簡單的方法是使用 Blueprint 或 Make,將權限納入預先建構的設定中。

在藍圖中:

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

在 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 \

建立名為 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>

將資訊清單中的權限新增至權限檔案。

使用 Dashcam 前,請先將 Camera2 權限授予 Dashcam 服務,如 AAOS 攝影機所示。

以與權限檔案相同的方式,將預先授予的權限檔案新增至 Blueprint 或 Make 檔案。

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>

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

詳情請參閱「將預先建構版本整合至系統映像檔」和「新增允許清單」。

側載

您也可以側載權限檔案。如果未設定預先建構的行車記錄器,請使用這個方法。

使用先前在預先建構部分建立的權限檔案,執行下列指令:

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

以類似 etc/default-permissions/ 的方式新增預先授予權限檔案。

設定重疊

行車記錄器服務有可疊加的設定。

服務設定

dashcam-service/res/values/config.xml

這個檔案包含服務的設定:

  • config_file /assets 中的觸發條件設定檔名稱
  • allow_internal_storage 允許將錄音內容儲存至內部儲存空間
  • boot_startup_enabled 裝置啟動時啟動行車記錄器服務
  • notifications_on 開始錄製時顯示通知
  • default_app_component 預設行車記錄器應用程式,具有全域錄影存取權和全域觸發存取權
  • recording_module 實作項目的 ComponentNameIRecordingModule
  • streaming_module 實作項目的 ComponentNameIStreamingModule
  • trigger_module 實作項目的 ComponentNameITriggerModule

觸發條件設定

如要設定錄製觸發條件,請複製下列項目:

dashcam-service/src/assets/config.xml

然後新增至素材資源目錄。在服務設定檔的 config_file 元素中指向這個檔案。

觸發條件設定包含儲存空間、攝影機和觸發條件部分:

儲存空間

儲存空間設定包含下列元素:

  • maxStorageUsagePercent 攝影機可用的儲存空間達到這個百分比上限後,就會開始修剪錄影內容。

  • maxStorageUsageMegabytes 攝影機在修剪錄影內容前使用的儲存空間上限 (以 MB 為單位)。

  • maxAgeHoursBeforePrune錄製內容遭修剪前的小時數上限。如果達到儲存空間上限,系統可能會提早修剪錄製內容。

相機

攝影機設定包含下列元素:

  • 攝影機 ID:攝影機 ID,並加上攝影機前置字串。

  • prerollLengthMs 每個事件要儲存的片頭廣告長度。

  • width 攝影機傳回的緩衝區寬度 (選用)。

  • height 相機傳回的緩衝區高度 (選用)。

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

這個範例顯示攝影機 ID EVS:1,前置廣告為 10 秒,解析度為 1080p;攝影機 ID Camera2:1,前置廣告為 10 秒,寬度和高度為預設值。

觸發條件

觸發條件設定包含下列定義的觸發條件清單:

  • name 觸發條件的專屬名稱。

  • cameras攝影機 ID。

  • sensorPropertyID 感應器 ID,並加上感應器群組前置字元。 前置字串選項為 VHALSENSOR_MANAGER

  • description UI 中顯示的觸發條件說明。

  • recordingLengthMs 事件後要記錄的時間長度 (以毫秒為單位)。

  • sensorValueType感應器產生的資料類型。選項包括 INTINT_ARRAYFLOATFLOAT_ARRAYBOOLEAN, STRING

  • thresholdType 如何根據 thresholdValue 評估感應器值。 選項包括 AVERAGEBOOLEANEQUALSLEAPLEAP_AVERAGELEAP_OVERPEAKPEAK_HOLD

  • thresholdValue 與感應器值比較的值。

  • thresholdExtra 某些門檻類型 (例如 AVERAGE 的範圍) 需要額外值。

  • triggerCooldown 觸發這類事件前,以毫秒為單位的冷卻時間。

<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>

這個範例顯示觸發條件,其中 TriggerModule 會監控產生整數值的 VHAL 感應器。TriggerModule 會比較是否等於門檻值。當符合等式條件時,觸發條件會記錄 EVS 攝影機 1 和 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"/>

這個範例顯示觸發條件,其中 TriggerModule 會監控產生浮點值的 VHAL 感應器。TriggerModule 會將一段範圍內10的感應器平均值與 20.0 的閾值進行比較。 取樣範圍是在 thresholdExtra 中設定。每隔 triggerCooldown 中設定的 2000 毫秒,才能觸發一次新事件。

模組

行車記錄器服務包含三個模組:

  • Stream 包含處理攝影機串流的邏輯。

  • 「Recording」包含處理錄音的邏輯。

  • 觸發條件:包含從感應器資料觸發錄製作業的邏輯。 模組 API 定義於對應的介面 (IStreamModuleIRecorderModuleITriggerModule),並透過 DashcamServiceAPI 公開至 DashcamManager

疊加模組

行車記錄器服務會使用 dashcam-service/res/values/config.xml 判斷模組實作的所在位置。每個模組都提供預設實作。不過,您可以透過設定對應的設定值,覆寫每個模組。

設定下列項目的 OEM 實作元件名稱:

  • IRecorderModulerecording_module
  • IStreamModulestreaming_module
  • ITriggerModuletrigger_module

在執行階段,Dashcam 服務會為每個模組例項化 config.xml 中設定的元件名稱。

應用程式開發人員指南

Dashcam 是可投入正式環境可自訂的行車記錄器解決方案。行車記錄器會使用 Dashcam Manager API 與 Dashcam service 通訊。行車記錄器管理員 API 位於 IDashcamManager只要應用程式具備必要權限,就能使用行車記錄器管理工具。

OverlayUI

您可以使用執行階段資源疊加層自訂應用程式。詳情請參閱「執行階段資源疊加」。如要查看可重疊的元素清單,請參閱 overlayable.xml

延長觸發時間

您可以呼叫 DashcamManager#addTrigger(),延長目前工作階段的觸發時間。新增的觸發條件只會在目前的工作階段中保留。

自動啟動

系統不支援自動開始錄製功能。不過,您可以呼叫 DashcamManager.startRecording(),手動觸發 onBoot

最佳做法

  • 儲存空間。強烈建議使用外部可移除式儲存空間。

  • 使用者體驗。設計直覺易用的 Dashcam 應用程式 UI,並遵守 Android Automotive OS 設計指南。

  • 效能最佳化。最佳化應用程式效能,盡量減少資源用量,確保應用程式在 AAOS 中順暢運作。

疑難排解

  • 攝影機連線問題。AAOS IVI 必須支援 EVS 或 Camera2,且可供使用。

  • 儲存空間錯誤。確認可用儲存空間並管理錄影內容。 強烈建議使用外部儲存空間,因為使用內部儲存空間可能會導致儲存空間過早耗損。