ผสานรวม Dashcam

แอปกล้องติดรถยนต์ออกแบบมาเพื่อผสานรวมกับ AAOS โดยมอบความสามารถในการบันทึกวิดีโอให้แก่ผู้ขับขี่เพื่อเพิ่มความปลอดภัย คู่มือนี้จะสรุปข้อกำหนดทางเทคนิค ขั้นตอนการผสานรวม และแนวทางปฏิบัติแนะนำเพื่อให้การติดตั้งใช้งานประสบความสำเร็จ

สิ่งที่ต้องมีก่อน

โปรดตรวจสอบว่าได้ปฏิบัติตามเงื่อนไขต่อไปนี้ก่อนดำเนินการต่อ

SDK:

  • ต้องใช้ SDK เวอร์ชัน 31 ขึ้นไป

ฮาร์ดแวร์:

  • กล้อง EVS หรือ Camera2 ที่พร้อมใช้งานสำหรับ AAOS
  • ต้องมีที่จัดเก็บข้อมูลภายในเพียงพอหรือรองรับที่จัดเก็บข้อมูลภายนอกแบบถอดออกได้
    สำหรับการบันทึกวิดีโอ

ข้อกำหนดของซอฟต์แวร์:

  • การสนับสนุนแบบแยก ดูข้อมูลเพิ่มเติมได้ที่ แอปแบบแยก
  • สิทธิ์ กล้องติดรถยนต์ต้องใช้สิทธิ์ของระบบ

รับซอร์สโค้ด

กล้องหน้ารถเป็นส่วนหนึ่งของแอปแบบแยกของ AAOS หากต้องการตรวจสอบโค้ดแบบแยก โปรดดู ตรวจสอบโค้ด

เรียกดูซอร์สโค้ดด้วย Android Code Search

ซอร์สโค้ดมีให้ใน 3 โมดูลต่อไปนี้

  • บริการกล้องติดรถยนต์ ลอจิกการสตรีม การบันทึก และการทริกเกอร์
  • ตัวจัดการกล้องติดรถยนต์ เชื่อมต่อกับบริการกล้องติดรถยนต์และแสดง API ที่เสถียรต่อไคลเอ็นต์
  • แอปกล้องหน้ารถ อ้างอิงแอปพลิเคชันกล้องหน้ารถโดยใช้ Dashcam Manager API

แผนภาพสถาปัตยกรรม

บิลด์กล้องติดรถยนต์

ใช้ 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 มีอยู่ในไฟล์ README

สิทธิ์

บริการกล้องหน้ารถและแอปกล้องหน้ารถต้องใช้สิทธิ์ของระบบหลายรายการ

วิธีที่ตรงไปตรงมาที่สุดในการให้สิทธิ์เหล่านี้คือการรวมสิทธิ์ไว้ในการตั้งค่าที่สร้างไว้ล่วงหน้าโดยใช้ 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"],
}

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>

เพิ่มสิทธิ์จากไฟล์ Manifest ลงในไฟล์สิทธิ์

ก่อนใช้กล้องติดรถยนต์ ให้ให้สิทธิ์ Camera2 แก่บริการกล้องติดรถยนต์ล่วงหน้าตามที่แสดงใน กล้อง 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,
}

ดูข้อมูลเพิ่มเติมได้ที่ผสานรวมการสร้างล่วงหน้าลงในอิมเมจระบบและเพิ่มรายการที่อนุญาต

Sideload

คุณยัง sideload ไฟล์สิทธิ์ได้ด้วย ใช้วิธีนี้เมื่อไม่ได้กำหนดค่ากล้องติดรถยนต์ที่สร้างไว้ล่วงหน้า

ใช้ไฟล์สิทธิ์ที่สร้างขึ้นในส่วนการสร้างล่วงหน้าก่อนหน้านี้ แล้วเรียกใช้คำสั่งต่อไปนี้

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 ComponentName ของการติดตั้งใช้งาน IRecordingModule
  • streaming_module ComponentName ของการติดตั้งใช้งาน IStreamingModule
  • trigger_module ComponentName ของการติดตั้งใช้งาน ITriggerModule

การกำหนดค่าทริกเกอร์

หากต้องการกำหนดค่าทริกเกอร์การบันทึก ให้สร้างสำเนาของไฟล์ต่อไปนี้

dashcam-service/src/assets/config.xml

แล้วเพิ่มไฟล์นี้ลงในไดเรกทอรี Asset ชี้ไปยังไฟล์นี้ในองค์ประกอบ config_file ในไฟล์การกำหนดค่าบริการ

การกำหนดค่าทริกเกอร์ประกอบด้วยส่วนพื้นที่เก็บข้อมูล กล้อง และทริกเกอร์

พื้นที่เก็บข้อมูล

การกำหนดค่าพื้นที่เก็บข้อมูลมีองค์ประกอบต่อไปนี้

  • maxStorageUsagePercent เปอร์เซ็นต์สูงสุดของพื้นที่เก็บข้อมูลที่พร้อมใช้งานซึ่งกล้องหน้ารถใช้ก่อนที่จะลบการบันทึก

  • maxStorageUsageMegabytes จำนวนพื้นที่เก็บข้อมูลสูงสุดในหน่วยเมกะไบต์ที่กล้องหน้ารถใช้ก่อนที่จะลบการบันทึก

  • maxAgeHoursBeforePrune จำนวนชั่วโมงสูงสุดก่อนที่จะลบการบันทึก ระบบอาจลบการบันทึกก่อนหน้านี้หากเป็นไปตามขีดจำกัดพื้นที่เก็บข้อมูล

กล้อง

การกำหนดค่ากล้องมีองค์ประกอบต่อไปนี้

  • รหัสกล้อง รหัสของกล้องที่มีคำนำหน้าเป็น "กล้อง"

  • prerollLengthMs ความยาวของ preroll ที่จะจัดเก็บไว้กับแต่ละเหตุการณ์

  • width ความกว้างของบัฟเฟอร์ที่กล้องแสดงผล (ไม่บังคับ)

  • height ความสูงของบัฟเฟอร์ที่กล้องแสดงผล (ไม่บังคับ)

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

ตัวอย่างนี้แสดงรหัสกล้อง EVS:1 ที่มี preroll 10 วินาทีที่ 1080p และ รหัสกล้อง Camera2:1 ที่มี preroll 10 วินาที รวมถึงความกว้างและความสูงเริ่มต้น

ทริกเกอร์

การกำหนดค่าทริกเกอร์ประกอบด้วยรายการทริกเกอร์ที่กำหนดโดยองค์ประกอบต่อไปนี้

  • name ชื่อทริกเกอร์ที่ไม่ซ้ำกัน

  • cameras รหัสของกล้อง

  • sensorPropertyID รหัสของเซ็นเซอร์ที่มีคำนำหน้าเป็นกลุ่มเซ็นเซอร์ ตัวเลือกคำนำหน้าคือ VHAL หรือ SENSOR_MANAGER

  • description คำอธิบายทริกเกอร์ที่จะแสดงใน UI

  • 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 ระบบจะทริกเกอร์เหตุการณ์ใหม่ได้ทุกๆ 2000 มิลลิวินาทีตามที่ตั้งค่าไว้ใน triggerCooldown

โมดูล

บริการกล้องหน้ารถประกอบด้วย 3 โมดูลต่อไปนี้

  • สตรีม มีลอจิกสำหรับการจัดการสตรีมจากกล้อง

  • การบันทึก มีลอจิกสำหรับการจัดการการบันทึก

  • ทริกเกอร์ มีลอจิกสำหรับการทริกเกอร์การบันทึกจากข้อมูลเซ็นเซอร์ API ของโมดูลกำหนดไว้ในอินเทอร์เฟซที่เกี่ยวข้อง ได้แก่ IStreamModule, IRecorderModule และ ITriggerModule และแสดงต่อ DashcamManager ผ่าน DashcamServiceAPI

โมดูลการวางซ้อน

บริการกล้องหน้ารถใช้ dashcam-service/res/values/config.xml เพื่อกำหนดตำแหน่งที่จะค้นหาการติดตั้งใช้งานโมดูล ระบบจะแสดงการติดตั้งใช้งานเริ่มต้นสำหรับแต่ละโมดูล อย่างไรก็ตาม คุณสามารถวางซ้อนแต่ละโมดูลได้โดยการตั้งค่าคอมโพเนนต์ในค่ากำหนดที่เกี่ยวข้อง

ตั้งค่าชื่อคอมโพเนนต์การติดตั้งใช้งาน OEM ขององค์ประกอบต่อไปนี้

  • IRecorderModule เป็น recording_module
  • IStreamModule เป็น streaming_module
  • ITriggerModule เป็น trigger_module

ในขณะรันไทม์ บริการกล้องหน้ารถจะสร้างอินสแตนซ์ของชื่อคอมโพเนนต์ที่ตั้งค่าไว้ใน config.xml สำหรับแต่ละโมดูล

คู่มือสำหรับนักพัฒนาแอป

Dashcam เป็นโซลูชันกล้องติดรถยนต์ที่พร้อมใช้งานจริง และปรับแต่งได้ กล้องหน้ารถ ใช้ Dashcam Manager API เพื่อสื่อสารกับ Dashcam service Dashcam Manager API จะอยู่ที่ IDashcamManager แอปใดก็ตามที่มีสิทธิ์ที่จำเป็นสามารถใช้ Dashcam Manager ได้

OverlayUI

คุณสามารถปรับแต่งแอปได้ด้วยการวางซ้อนทรัพยากรขณะรันไทม์ ดูข้อมูลเพิ่มเติมได้ที่ การวางซ้อนทรัพยากรขณะรันไทม์ หากต้องการดูรายการองค์ประกอบที่วางซ้อนได้ โปรดดู overlayable.xml

ขยายทริกเกอร์

คุณสามารถขยายทริกเกอร์สำหรับเซสชันปัจจุบันได้โดยเรียกใช้ DashcamManager#addTrigger() ทริกเกอร์ที่เพิ่มจะยังคงอยู่สำหรับเซสชันปัจจุบันเท่านั้น

การเริ่มต้นอัตโนมัติ

ระบบไม่รองรับการบันทึกแบบเริ่มต้นอัตโนมัติ อย่างไรก็ตาม คุณสามารถเริ่มทริกเกอร์ด้วยตนเอง onBoot ได้โดยเรียกใช้ DashcamManager.startRecording()

แนวทางปฏิบัติแนะนำ

  • พื้นที่เก็บข้อมูล ขอแนะนำให้ใช้ที่เก็บข้อมูลภายนอกแบบถอดออกได้

  • ประสบการณ์ของผู้ใช้ ออกแบบ UI ของแอปกล้องติดรถยนต์ให้ใช้งานง่ายและเป็นมิตรกับผู้ใช้ โดยปฏิบัติตามหลักเกณฑ์การออกแบบ AAOS

  • การเพิ่มประสิทธิภาพ เพิ่มประสิทธิภาพของแอปเพื่อลดการใช้ทรัพยากรและให้การทำงานใน AAOS เป็นไปอย่างราบรื่น

การแก้ปัญหา

  • ปัญหาเกี่ยวกับการเชื่อมต่อกล้อง AAOS IVI ต้องรองรับและมี EVS หรือ Camera2

  • ข้อผิดพลาดเกี่ยวกับพื้นที่เก็บข้อมูล ตรวจสอบพื้นที่เก็บข้อมูลที่พร้อมใช้งานและจัดการการบันทึก ขอแนะนำให้ใช้ที่จัดเก็บข้อมูลภายนอก เนื่องจากที่จัดเก็บข้อมูลภายในอาจเสื่อมสภาพก่อนเวลาอันควร