Dashcam را ادغام کنید

اپلیکیشن Dashcam برای ادغام با AAOS طراحی شده است و قابلیت‌های ضبط ویدیو را برای ایمنی و امنیت بیشتر در اختیار رانندگان قرار می‌دهد. این راهنما الزامات فنی، مراحل ادغام و بهترین شیوه‌ها را برای اطمینان از پیاده‌سازی موفقیت‌آمیز تشریح می‌کند.

پیش‌نیازها

قبل از ادامه، مطمئن شوید که این پیش‌شرط‌ها برآورده شده‌اند:

کیت توسعه نرم‌افزار:

  • SDK 31 یا بالاتر مورد نیاز است.

سخت‌افزار:

  • دوربین‌های EVS یا Camera2 در دسترس AAOS هستند.
  • فضای ذخیره‌سازی داخلی کافی یا پشتیبانی از حافظه خارجی قابل جابجایی
    باید برای ضبط ویدیو در دسترس باشد.

نیازمندی‌های نرم‌افزاری:

  • پشتیبانی بدون محدودیت. برای کسب اطلاعات بیشتر، به برنامه‌های بدون محدودیت مراجعه کنید.
  • مجوزها. دَش‌کم به مجوزهای سیستم نیاز دارد.

دریافت کد منبع

Dashcam بخشی از برنامه‌های غیر رایگان AAOS است. برای بررسی کد غیر رایگان، به بخش «بررسی کد» مراجعه کنید.

با استفاده از جستجوی کد اندروید، کد منبع را مرور کنید.

کد منبع در این سه ماژول ارائه شده است:

  • سرویس دوربین داشبورد. پخش، ضبط و راه‌اندازی منطق.
  • مدیر دوربین داشبورد. به سرویس دوربین داشبورد متصل می‌شود و یک API پایدار را در اختیار کلاینت‌ها قرار می‌دهد.
  • اپلیکیشن Dashcam. اپلیکیشن مرجع Dashcam با استفاده از رابط برنامه‌نویسی کاربردی Dashcam Manager

نمودار معماری

ساخت دوربین داشبورد

برای ساخت Dashcam از Soong یا Gradle استفاده کنید.

سونگ

در مورد سونگ:

mma DashcamService DashcamManager-lib DashcamApp

فایل‌های APK در out/target/product/[lunch-target]/system/priv-app/ قرار دارند.

گرادل

روی گریدل:

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

فایل‌های APK در out/aaos-apps-gradle-build/ قرار دارند.

دستورالعمل‌های دقیق برای ساخت Dashcam با Gradle در فایل README ارائه شده است.

مجوزها

چندین مجوز سیستمی برای سرویس و برنامه 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,
}

در ساخت:

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 را به فایل مجوزها اضافه کنید.

قبل از استفاده از Dashcam، مجوزهای Camera2 را همانطور که در AAOS Camera نشان داده شده است، به سرویس Dashcam اعطا کنید.

فایل مجوزهای از پیش تعیین‌شده را به همان روشی که فایل مجوزها را اضافه می‌کنید، به فایل 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 بارگذاری شود. از این روش زمانی استفاده کنید که 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

فایل مجوزهای pregrant را به روشی مشابه به etc/default-permissions/ اضافه کنید.

پیکربندی پوشش‌ها

سرویس Dashcam دارای تنظیمات قابل همپوشانی است.

پیکربندی سرویس

dashcam-service/res/values/config.xml

این فایل شامل تنظیمات مربوط به سرویس است:

  • config_file نام فایل پیکربندی تریگر در /assets
  • allow_internal_storage اجازه می‌دهد ضبط‌ها در حافظه داخلی ذخیره شوند
  • boot_startup_enabled سرویس Dashcam هنگام بوت شدن دستگاه شروع به کار می‌کند
  • notifications_on نمایش اعلان‌ها هنگام شروع ضبط
  • default_app_component برنامه پیش‌فرض دوربین داشبورد که به ضبط‌های سراسری و دسترسی به تریگر سراسری دسترسی دارد.
  • recording_module نام کامپوننت پیاده‌سازی IRecordingModule
  • streaming_module نام کامپوننت پیاده‌سازی IStreamingModule
  • trigger_module نام کامپوننت پیاده‌سازی ITriggerModule

پیکربندی تریگر

برای پیکربندی محرک‌های ضبط، یک کپی از موارد زیر ایجاد کنید:

dashcam-service/src/assets/config.xml

و این را به دایرکتوری assets اضافه کنید. در عنصر 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 را با پیش‌نمایش ۱۰ ثانیه‌ای در وضوح ۱۰۸۰p و دوربین با شناسه Camera2:1 را با پیش‌نمایش ۱۰ ثانیه‌ای و عرض و ارتفاع پیش‌فرض نشان می‌دهد.

ماشه

پیکربندی تریگر شامل فهرستی از تریگرها است که به صورت زیر تعریف می‌شوند:

  • name نام منحصر به فرد تریگر.

  • شناسه cameras .

  • sensorPropertyID شناسه حسگر است که با گروه حسگر پیشوند شده است. گزینه‌های پیشوند عبارتند از VHAL یا SENSOR_MANAGER .

  • description شرح تریگر (trigger) که در رابط کاربری نمایش داده می‌شود.

  • مدت زمان 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) را نشان می‌دهد که در آن TriggerModule یک حسگر VHAL را که مقادیر صحیح تولید می‌کند، رصد می‌کند. TriggerModule برابری را با مقدار آستانه مقایسه می‌کند. هنگامی که شرط برابری برقرار شود، یک تریگر (trigger) روی دوربین‌های 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 فعال شود.

ماژول‌ها

سرویس Dashcam از سه ماژول تشکیل شده است:

  • Stream شامل منطق لازم برای مدیریت جریان‌های ارسالی از دوربین‌ها است.

  • ضبط شامل منطق لازم برای مدیریت ضبط‌ها است.

  • Trigger شامل منطق لازم برای شروع ضبط از داده‌های حسگر است. APIهای ماژول در رابط‌های مربوطه خود، IStreamModule ، IRecorderModule و ITriggerModule تعریف شده‌اند و از طریق DashcamServiceAPI در اختیار DashcamManager قرار می‌گیرند.

ماژول‌های روکش

سرویس Dashcam از dashcam-service/res/values/config.xml برای تعیین محل یافتن پیاده‌سازی‌های ماژول استفاده می‌کند. پیاده‌سازی‌های پیش‌فرض برای هر ماژول ارائه شده است. با این حال، می‌توان با تنظیم مؤلفه آن در مقدار پیکربندی مربوطه، هر ماژول را همپوشانی کرد.

نام کامپوننت پیاده‌سازی OEM را برای موارد زیر تنظیم کنید:

  • IRecorderModule به recording_module
  • IStreamModule به streaming_module
  • ITriggerModule به trigger_module

در زمان اجرا، سرویس Dashcam نام کامپوننت تنظیم‌شده در config.xml را برای هر ماژول نمونه‌سازی می‌کند.

راهنمای توسعه‌دهنده اپلیکیشن

Dashcam یک راهکار Dashcam آماده برای تولید و قابل تنظیم است. Dashcam از APIهای Dashcam Manager برای ارتباط با Dashcam service استفاده می‌کند. API Dashcam Manager را می‌توانید در IDashcamManager پیدا کنید. هر برنامه‌ای که مجوزهای لازم را داشته باشد می‌تواند از Dashcam Manager استفاده کند.

OverlayUI

این برنامه را می‌توان با Runtime Resource Overlays سفارشی کرد. برای کسب اطلاعات بیشتر، به Runtime Resource Overlays مراجعه کنید. برای مشاهده لیست عناصر قابل همپوشانی، به overlayable.xml مراجعه کنید.

محرک‌ها را گسترش دهید

تریگرها را می‌توان با فراخوانی DashcamManager#addTrigger() برای جلسه فعلی تمدید کرد. تریگرهای اضافه شده فقط برای جلسه فعلی باقی می‌مانند.

شروع خودکار

ضبط خودکار پشتیبانی نمی‌شود. با این حال، می‌توان با فراخوانی DashcamManager.startRecording() onBoot یک تریگر دستی راه‌اندازی کرد.

بهترین شیوه‌ها

  • فضای ذخیره‌سازی. استفاده از حافظه خارجی قابل جابجایی اکیداً توصیه می‌شود.

  • تجربه کاربری. رابط کاربری اپلیکیشن Dashcam را طوری طراحی کنید که کاربرپسند و کاربرپسند باشد و از دستورالعمل‌های طراحی AAOS پیروی کند.

  • بهینه‌سازی عملکرد. عملکرد برنامه را بهینه کنید تا استفاده از منابع را به حداقل برسانید و عملکرد روان را در AAOS تضمین کنید.

عیب‌یابی

  • مشکلات اتصال دوربین. EVS یا Camera2 باید در AAOS IVI پشتیبانی و در دسترس باشند.

  • خطاهای ذخیره‌سازی. فضای ذخیره‌سازی موجود را بررسی کنید و ضبط‌ها را مدیریت کنید. استفاده از حافظه خارجی اکیداً توصیه می‌شود زیرا استفاده از حافظه داخلی می‌تواند باعث فرسودگی زودرس فضای ذخیره‌سازی شود.