Ứng dụng Dashcam được thiết kế để tích hợp với AAOS, cung cấp cho người lái xe khả năng quay video để tăng cường sự an toàn và bảo mật. Hướng dẫn này trình bày các yêu cầu kỹ thuật, các bước tích hợp và các phương pháp hay nhất để đảm bảo quá trình triển khai diễn ra thành công.
Điều kiện tiên quyết
Trước khi tiếp tục, hãy đảm bảo bạn đáp ứng các điều kiện tiên quyết sau:
SDK:
- Yêu cầu SDK 31 trở lên.
Phần cứng:
- Camera EVS hoặc Camera2 có sẵn cho AAOS.
- Bạn phải có đủ bộ nhớ trong hoặc hỗ trợ bộ nhớ ngoài có thể tháo rời
để quay video.
Yêu cầu về phần mềm:
- Hỗ trợ riêng lẻ. Để tìm hiểu thêm, hãy xem bài viết Ứng dụng không đi kèm.
- Quyền. Dashcam cần có quyền truy cập hệ thống.
Lấy mã nguồn
Dashcam là một phần của các ứng dụng tách rời AAOS. Để xem mã chưa được kết hợp, hãy xem phần Kiểm tra mã.
Duyệt mã nguồn bằng Android Code Search (Công cụ tìm kiếm mã Android).
Mã nguồn được cung cấp trong 3 mô-đun sau:
- Dịch vụ camera hành trình. Logic phát trực tuyến, ghi hình và kích hoạt.
- Dashcam Manager. Kết nối với Dịch vụ camera hành trình và cung cấp một API ổn định cho các ứng dụng
- Ứng dụng camera hành trình.Tham khảo ứng dụng camera hành trình bằng Dashcam Manager API
Bản dựng Dashcam
Dùng Soong hoặc Gradle để tạo Dashcam.
Soong
On Soong:
mma DashcamService DashcamManager-lib DashcamApp
Các APK này nằm trong out/target/product/[lunch-target]/system/priv-app/
Gradle
Trên Gradle:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
Các APK này nằm trong out/aaos-apps-gradle-build/
Hướng dẫn chi tiết về cách tạo Camera hành trình bằng Gradle có trong tệp README.
Quyền
Dịch vụ Dashcam và Ứng dụng Dashcam cần có một số quyền hệ thống.
Cách đơn giản nhất để cấp các quyền này là đưa chúng vào một chế độ thiết lập dựng sẵn bằng cách sử dụng Blueprint hoặc Make.
Trong 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,
}
Trong 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 \
Tạo một tệp quyền có tên là 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>
Thêm các quyền từ tệp kê khai vào tệp quyền.
Trước khi sử dụng Dashcam, hãy cấp trước quyền Camera2 cho Dịch vụ Dashcam như minh hoạ trong Camera AAOS.
Thêm tệp quyền được cấp trước vào tệp Blueprint hoặc Make theo cách tương tự như tệp quyền.
Trong 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>
Trong 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,
}
Để tìm hiểu thêm, hãy xem phần Tích hợp một bản dựng trước vào hình ảnh hệ thống và Thêm danh sách cho phép.
Cài đặt không qua cửa hàng ứng dụng
Bạn cũng có thể tải tệp quyền theo cách thủ công. Sử dụng phương thức này khi bạn chưa định cấu hình Camera hành trình được tạo sẵn.
Sử dụng tệp quyền được tạo trong phần dựng sẵn trước đó, hãy chạy:
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
Thêm tệp quyền trước khi cấp theo cách tương tự như etc/default-permissions/.
Định cấu hình lớp phủ
Dịch vụ camera hành trình có các cấu hình có thể phủ lên.
Cấu hình dịch vụ
dashcam-service/res/values/config.xml
Tệp này chứa cấu hình cho dịch vụ:
config_fileTên của tệp cấu hình điều kiện kích hoạt trong/assetsallow_internal_storageCho phép lưu bản ghi âm vào bộ nhớ trongboot_startup_enabledDịch vụ Dashcam bắt đầu khi thiết bị khởi độngnotifications_onHiện thông báo khi quá trình ghi bắt đầudefault_app_componentỨng dụng camera hành trình mặc định, có quyền truy cập vào bản ghi và quyền truy cập vào trình kích hoạt trên toàn cầurecording_moduleComponentName của quá trình triển khaiIRecordingModulestreaming_moduleComponentName của quá trình triển khaiIStreamingModuletrigger_moduleComponentName của quá trình triển khaiITriggerModule
Cấu hình điều kiện kích hoạt
Để định cấu hình trình kích hoạt ghi hình, hãy tạo một bản sao của:
dashcam-service/src/assets/config.xml
và thêm tệp này vào thư mục tài sản. Trỏ đến tệp này trong phần tử config_file trong tệp cấu hình dịch vụ.
Cấu hình trình kích hoạt bao gồm các phần lưu trữ, camera và trình kích hoạt:
Bộ nhớ
Cấu hình bộ nhớ có các phần tử sau:
maxStorageUsagePercentTỷ lệ phần trăm tối đa của bộ nhớ trống mà camera hành trình sử dụng trước khi cắt bớt các bản ghi.maxStorageUsageMegabytesDung lượng bộ nhớ tối đa mà camera hành trình sử dụng trước khi cắt bớt các bản ghi.maxAgeHoursBeforePruneSố giờ tối đa trước khi bản ghi bị cắt bớt. Bản ghi có thể bị cắt bớt sớm hơn nếu đạt đến hạn mức bộ nhớ.
Máy ảnh
Cấu hình camera có các phần tử sau:
Mã nhận dạng camera. Mã nhận dạng của camera có tiền tố camera.
prerollLengthMsThời lượng của quảng cáo trước video được lưu trữ với mỗi sự kiện.widthChiều rộng không bắt buộc của vùng đệm do camera trả về.heightChiều cao không bắt buộc của vùng đệm do camera trả về.
<CameraConfig>
<Camera
ID="EVS:1"
prerollLengthMs="10000"
width="1920"
height="1080" />
<Camera
ID="Camera2:1"
prerollLengthMs="10000" />
</CameraConfig>
Ví dụ này cho thấy camera có mã nhận dạng EVS:1 có quảng cáo trước video dài 10 giây ở độ phân giải 1080p và camera có mã nhận dạng Camera2:1 có quảng cáo trước video dài 10 giây cùng chiều rộng và chiều cao mặc định.
Kích hoạt
Cấu hình điều kiện kích hoạt bao gồm một danh sách các điều kiện kích hoạt được xác định theo những yếu tố sau:
nameTên duy nhất của điều kiện kích hoạt.camerasmã nhận dạng của camera.sensorPropertyIDMã nhận dạng của cảm biến có tiền tố là nhóm cảm biến. Các lựa chọn về tiền tố làVHALhoặcSENSOR_MANAGER.descriptionNội dung mô tả về điều kiện kích hoạt xuất hiện trong giao diện người dùng.recordingLengthMsKhoảng thời gian sau sự kiện cần ghi lại tính bằng mili giây.sensorValueTypeLoại dữ liệu do cảm biến tạo ra. Các lựa chọn làINT,INT_ARRAY,FLOAT,FLOAT_ARRAYvàBOOLEAN, STRING.thresholdTypeCách đánh giá giá trị cảm biến dựa trênthresholdValue. Các lựa chọn làAVERAGE,BOOLEAN,EQUALS,LEAP,LEAP_AVERAGE,LEAP_OVER,PEAKvàPEAK_HOLD.thresholdValueGiá trị được so sánh với giá trị của cảm biến.thresholdExtraCần có giá trị bổ sung cho một số loại ngưỡng, chẳng hạn như phạm vi choAVERAGE.triggerCooldownThời gian chờ tính bằng mili giây trước khi kích hoạt một sự kiện khác thuộc loại này.
<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>
Ví dụ này cho thấy một điều kiện kích hoạt trong đó TriggerModule giám sát một cảm biến VHAL tạo ra các giá trị số nguyên.
TriggerModule so sánh sự bằng nhau với giá trị ngưỡng. Khi điều kiện về sự bằng nhau được đáp ứng, một sự kiện kích hoạt sẽ ghi lại trên camera EVS 1 và 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"/>
Ví dụ này cho thấy một trình kích hoạt trong đó TriggerModule giám sát một cảm biến VHAL tạo ra các giá trị số thực.
TriggerModule so sánh mức trung bình của cảm biến trên một dải 10 mẫu với giá trị ngưỡng 20.0.
Phạm vi mẫu được đặt trong thresholdExtra. Bạn chỉ có thể kích hoạt một sự kiện mới sau mỗi 2000 mili giây như đã đặt trong triggerCooldown.
Mô-đun
Dashcam Service bao gồm 3 mô-đun:
Stream chứa logic để xử lý luồng dữ liệu từ camera.
Recording (Ghi hình) chứa logic để xử lý bản ghi.
Trigger chứa logic để kích hoạt quá trình ghi từ dữ liệu cảm biến. Các API mô-đun được xác định trong các giao diện tương ứng,
IStreamModule,IRecorderModulevàITriggerModule, đồng thời được hiển thị choDashcamManagerthông quaDashcamServiceAPI.
Mô-đun lớp phủ
Dashcam Service sử dụng dashcam-service/res/values/config.xml để xác định vị trí tìm các hoạt động triển khai mô-đun. Các phương thức triển khai mặc định được cung cấp cho từng mô-đun. Tuy nhiên, bạn có thể phủ từng mô-đun bằng cách đặt thành phần của mô-đun đó trong giá trị cấu hình tương ứng.
Đặt tên thành phần triển khai OEM của:
IRecorderModuleđếnrecording_moduleIStreamModuleđếnstreaming_moduleITriggerModuleđếntrigger_module
Trong thời gian chạy, dịch vụ Camera hành trình sẽ tạo thực thể cho tên thành phần được đặt trong config.xml cho từng mô-đun.
Hướng dẫn dành cho nhà phát triển ứng dụng
Dashcam là một giải pháp camera hành trình có thể tuỳ chỉnh và sẵn sàng phát hành công khai. Camera hành trình sử dụng Dashcam Manager API để giao tiếp với Dashcam service. Bạn có thể tìm thấy API Camera hành trình tại IDashcamManager. Mọi ứng dụng có các quyền cần thiết đều có thể sử dụng Dashcam Manager.
OverlayUI
Bạn có thể tuỳ chỉnh ứng dụng bằng Lớp phủ tài nguyên thời gian chạy. Để tìm hiểu thêm, hãy xem phần Lớp phủ tài nguyên trong thời gian chạy. Để xem danh sách các phần tử có thể phủ lên, hãy xem overlayable.xml.
Mở rộng điều kiện kích hoạt
Bạn có thể mở rộng điều kiện kích hoạt cho phiên hiện tại bằng một lệnh gọi đến DashcamManager#addTrigger(). Các điều kiện kích hoạt đã thêm chỉ có hiệu lực trong phiên hiện tại.
Tự động bắt đầu
Không hỗ trợ tính năng tự động bắt đầu ghi. Tuy nhiên, bạn có thể bắt đầu một trình kích hoạt thủ công onBoot bằng cách gọi DashcamManager.startRecording()
Các phương pháp hay nhất
Bộ nhớ. Bạn nên sử dụng bộ nhớ ngoài có thể tháo rời.
Trải nghiệm người dùng. Thiết kế giao diện người dùng của ứng dụng Dashcam sao cho trực quan và thân thiện với người dùng, đồng thời tuân thủ các nguyên tắc thiết kế của AAOS.
Tối ưu hoá hiệu suất. Tối ưu hoá hiệu suất của ứng dụng để giảm thiểu mức sử dụng tài nguyên và đảm bảo hoạt động trơn tru trong AAOS.
Khắc phục sự cố
Vấn đề về kết nối camera. EVS hoặc Camera2 phải được hỗ trợ và có trong IVI của AAOS.
Lỗi bộ nhớ. Xác minh dung lượng lưu trữ còn trống và quản lý bản ghi. Bạn nên sử dụng bộ nhớ ngoài vì việc sử dụng bộ nhớ trong có thể khiến bộ nhớ bị hao mòn sớm.