ผสานรวม Dashcam

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

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

โปรดตรวจสอบว่าคุณมีคุณสมบัติตรงตามข้อกําหนดเบื้องต้นต่อไปนี้ก่อนดําเนินการต่อ

SDK:

  • ต้องใช้ SDK 31 ขึ้นไป

ฮาร์ดแวร์:

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

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

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

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

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

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

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

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

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

สร้าง 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/

ดูวิธีการโดยละเอียดในการสร้าง Dashcam ด้วย Gradle ได้ในไฟล์ README

สิทธิ์

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

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

ใน "สร้าง"

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 Camera

เพิ่มไฟล์สิทธิ์ที่มอบไว้ล่วงหน้าลงในไฟล์ 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,
}

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

ไซด์โหลด

นอกจากนี้ คุณยังโหลดไฟล์สิทธิ์จากแหล่งที่ไม่รู้จักได้ด้วย ใช้วิธีนี้เมื่อไม่ได้กำหนดค่า 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 ComponentName ของการใช้งาน IRecordingModule
  • streaming_module ComponentName ของการใช้งาน IStreamingModule
  • trigger_module ComponentName ของการใช้งาน ITriggerModule

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

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

dashcam-service/src/assets/config.xml

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

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

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

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

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

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

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

กล้อง

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

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

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

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

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

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

ตัวอย่างนี้แสดงรหัสกล้อง EVS:1 ที่มีช่วงโฆษณาตอนต้น 10 วินาทีที่ 1080p และรหัสกล้อง Camera2:1 ที่มีช่วงโฆษณาตอนต้น 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 ที่สร้างค่าประเภท float TriggerModule เปรียบเทียบค่าเฉลี่ยของเซ็นเซอร์ในช่วงตัวอย่าง 10 กับค่าเกณฑ์ 20.0 ตั้งค่าช่วงตัวอย่างใน thresholdExtra ระบบจะทริกเกอร์เหตุการณ์ใหม่ได้ทุกๆ 2000 มิลลิวินาทีตามที่กําหนดไว้ใน triggerCooldown เท่านั้น

โมดูล

บริการ Dashcam ประกอบด้วย 3 โมดูล ได้แก่

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

  • Recording มีตรรกะสำหรับการจัดการไฟล์บันทึกเสียง

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

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

บริการ Dashcam ใช้ 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 ได้

OverlayUI

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

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

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

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

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

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

  • พื้นที่เก็บข้อมูล ขอแนะนําอย่างยิ่งให้ใช้อุปกรณ์เก็บข้อมูลแบบถอดออกได้ภายนอก

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

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

การแก้ปัญหา

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

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