Dashcam 應用程式旨在整合 AAOS,為駕駛人提供錄影功能,提升安全性。本指南將概略說明技術需求、整合步驟和最佳做法,確保導入作業順利進行。
必要條件
繼續操作前,請確認已符合下列先決條件:
SDK:
- 需要 SDK 31 以上版本。
硬體:
- AAOS 可使用 EVS 或 Camera2 攝影機。
- 必須有足夠的內部儲存空間,或支援可移除的外部儲存空間
,才能錄製影片。
軟體需求:
- 不含套裝的支援服務。詳情請參閱「未綁定的應用程式」。
- 權限:Dashcam 需要系統權限。
取得原始碼
行車記錄器是 AAOS 中未綁定的應用程式。如要檢查未內含的程式碼,請參閱「檢查程式碼」一文。
使用 Android Code Search 瀏覽原始碼。
原始碼會提供在以下三個模組中:
- 行車記錄器服務。串流、錄影和觸發邏輯。
- Dashcam Manager連線至 Dashcam 服務,並向用戶端公開穩定的 API
- Dashcam 應用程式:使用 Dashcam Manager API 的參考 Dashcam 應用程式
建構 Dashcam
使用 Soong 或 Gradle 建構 Dashcam。
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/
README
檔案提供使用 Gradle 建構 Dashcam 的詳細操作說明。
權限
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 Camera 所示。
以與權限檔案相同的方式,將預先授予的權限檔案新增至藍圖或 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,
}
詳情請參閱「將預先建構的內容整合至系統映像檔」和「新增許可清單」。
側載
您也可以側載權限檔案。如果未設定預先建構的 Dashcam,請使用這個方法。
使用先前在預先建構部分建立的權限檔案,執行以下操作:
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
IRecordingModule
實作項目的 ComponentNamestreaming_module
IStreamingModule
實作項目的 ComponentNametrigger_module
ITriggerModule
實作項目的 ComponentName
觸發條件設定
如要設定錄製觸發條件,請建立以下項目的副本:
dashcam-service/src/assets/config.xml
並將其新增至 assets 目錄。在服務設定檔的 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,前面會加上感應器群組。前置字串選項為VHAL
或SENSOR_MANAGER
。description
使用者介面中顯示的觸發條件說明。recordingLengthMs
事件後的錄影時間長度 (以毫秒為單位)。sensorValueType
感應器產生的資料類型。選項包括INT
、INT_ARRAY
、FLOAT
、FLOAT_ARRAY
和BOOLEAN, STRING
。thresholdType
如何根據thresholdValue
評估感應器值。選項包括AVERAGE
、BOOLEAN
、EQUALS
、LEAP
、LEAP_AVERAGE
、LEAP_OVER
、PEAK
和PEAK_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
毫秒觸發一次。
模組
Dashcam Service 由三個模組組成:
Stream 包含處理攝影機串流的邏輯。
Recording 包含處理錄音檔的邏輯。
Trigger 包含根據感應器資料觸發錄影的邏輯。模組 API 會在對應的介面 (
IStreamModule
、IRecorderModule
和ITriggerModule
) 中定義,並透過DashcamServiceAPI
公開給DashcamManager
。
疊加模組
Dashcam Service 會使用 dashcam-service/res/values/config.xml
判斷模組實作項目的位置。每個模組都提供預設實作項目。不過,您可以透過在對應的設定值中設定元件,為每個模組疊加。
設定下列項目的 OEM 實作元件名稱:
IRecorderModule
到recording_module
IStreamModule
到streaming_module
ITriggerModule
到trigger_module
在執行階段,Dashcam 服務會為每個模組將 config.xml
中設定的元件名稱例項化。
應用程式開發人員指南
Dashcam 是可自訂的即用型車輛行車記錄器解決方案。行車記錄器會使用 Dashcam Manager API 與 Dashcam service
通訊。如要查看 Dashcam Manager API,請前往 IDashcamManager
。只要具備必要權限,任何應用程式都可以使用 Dashcam Manager。
重疊式使用者介面
您可以使用執行階段資源覆蓋圖自訂應用程式。詳情請參閱「執行階段資源重疊」。如要查看可疊加元素的清單,請參閱 overlayable.xml。
延長觸發條件
您可以呼叫 DashcamManager#addTrigger()
,為目前的工作階段延長觸發事件。新增的觸發條件只會在目前的工作階段持續存在。
自動啟動
不支援自動錄影功能。不過,您可以透過呼叫 DashcamManager.startRecording()
來啟動手動觸發事件 onBoot
最佳做法
儲存空間。強烈建議使用外部可移除式儲存空間。
使用者體驗。設計 Dashcam 應用程式的使用者介面,讓使用者能輕鬆操作,並遵循 AAOS 設計指南。
效能最佳化。最佳化應用程式效能,盡可能減少資源用量,並確保在 AAOS 中順暢運作。
疑難排解
攝影機連線問題AAOS IVI 必須支援 EVS 或 Camera2,且可供使用。
儲存空間錯誤:確認可用儲存空間並管理錄影。我們強烈建議使用外部儲存空間,因為使用內部儲存空間可能會提早導致儲存空間耗損。