دمج كاميرا Dashcam

تم تصميم تطبيق Dashcam للاندماج مع AAOS، ما يوفّر للسائقين إمكانات تسجيل الفيديو لتعزيز السلامة والأمان. يحدّد هذا الدليل المتطلبات الفنية وخطوات الدمج وأفضل الممارسات لضمان عملية استخدام ناجحة.

المتطلبات الأساسية

قبل المتابعة، تأكَّد من استيفاء الشروط المسبقة التالية:

حزمة تطوير البرامج (SDK):

  • يجب توفُّر حزمة تطوير البرامج (SDK) الإصدار 31 أو إصدار أحدث.

الأجهزة:

  • يجب أن تكون كاميرات EVS أو Camera2 متاحة لنظام التشغيل AAOS.
  • يجب توفُّر مساحة تخزين داخلية كافية أو دعم لوحدة تخزين خارجية قابلة للإزالة
    لتسجيلات الفيديو.

متطلبات البرامج:

  • الدعم غير المجمّع لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التطبيقات غير المجمّعة.
  • الأذونات يتطلّب تطبيق Dashcam أذونات النظام.

الحصول على رمز المصدر

يُعدّ تطبيق Dashcam جزءًا من التطبيقات غير المجمّعة في AAOS. للاطّلاع على الرمز غير المجمّع، يُرجى الاطّلاع على مقالة الاطّلاع على الرمز.

يمكنك تصفُّح رمز المصدر باستخدام Android Code Search.

يتم توفير رمز المصدر في الوحدات الثلاث التالية:

  • خدمة Dashcam منطق البث والتسجيل والتشغيل
  • مدير Dashcam يتصل بخدمة Dashcam ويعرض واجهة برمجة تطبيقات ثابتة للعملاء
  • تطبيق Dashcam تطبيق Dashcam مرجعي يستخدم واجهة برمجة تطبيقات "مدير 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/

يتم تقديم تعليمات مفصّلة لإنشاء تطبيق Dashcam باستخدام Gradle في ملف README.

الأذونات

تتطلّب خدمة Dashcam وتطبيق Dashcam العديد من أذونات النظام.

أسهل طريقة لمنح هذه الأذونات هي تضمينها في إعداد مُنشأ مسبقًا باستخدام 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 إلى ملف الأذونات.

قبل استخدام Dashcam، امنح خدمة Dashcam أذونات 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)

يمكن أيضًا تحميل ملف الأذونات بشكل جانبي. استخدِم هذه الطريقة عندما لا يكون تطبيق 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 على إعدادات قابلة للطبقة.

إعداد الخدمة

dashcam-service/res/values/config.xml

يحتوي هذا الملف على إعدادات الخدمة:

  • config_file اسم ملف إعدادات المشغِّل في /assets
  • allow_internal_storage السماح بحفظ التسجيلات في وحدة التخزين الداخلية
  • boot_startup_enabled بدء خدمة Dashcam عند تشغيل الجهاز
  • notifications_on عرض الإشعارات عند بدء التسجيل
  • default_app_component تطبيق Dashcam التلقائي الذي يتيح الوصول إلى التسجيلات والمشغّلات على مستوى العالم
  • recording_module اسم مكوّن تنفيذ IRecordingModule
  • streaming_module اسم مكوّن تنفيذ IStreamingModule
  • trigger_module اسم مكوّن تنفيذ ITriggerModule

إعدادات المشغِّل

لضبط مشغّلات التسجيل، أنشئ نسخة من:

dashcam-service/src/assets/config.xml

وأضِفها إلى مجلّد الموارد. أشِر إلى هذا الملف في العنصر config_file في ملف إعدادات الخدمة.

تتألف إعدادات المشغِّل من أجزاء التخزين والكاميرا والمشغِّل:

مساحة التخزين

تحتوي إعدادات مساحة التخزين على العناصر التالية:

  • maxStorageUsagePercent الحد الأقصى للنسبة المئوية من مساحة التخزين المتاحة التي يستخدمها تطبيق Dashcam قبل إزالة التسجيلات

  • maxStorageUsageMegabytes الحد الأقصى لمساحة التخزين بالميغابايت التي يستخدمها تطبيق Dashcam قبل إزالة التسجيلات

  • 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 ثوانٍ وعرض وارتفاع تلقائيَين.

Trigger

تتألف إعدادات المشغِّل من قائمة بالمشغّلات المحدّدة من خلال ما يلي:

  • name اسم المشغِّل الفريد

  • cameras أرقام تعريف الكاميرات

  • sensorPropertyID رقم تعريف جهاز الاستشعار مسبوقًا بمجموعة أجهزة الاستشعار خيارات البادئة هي 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. لا يمكن تشغيل حدث جديد إلا كل 2000 ملّي ثانية كما هو مضبوط في triggerCooldown.

الوحدات

تتألف خدمة Dashcam من ثلاث وحدات:

  • تحتوي البث على منطق معالجة البث من الكاميرات.

  • تحتوي التسجيل على منطق معالجة التسجيلات.

  • تحتوي المشغِّل على منطق تشغيل التسجيل من بيانات جهاز الاستشعار. يتم تحديد واجهات برمجة تطبيقات الوحدة في واجهاتها المقابلة، IStreamModule وIRecorderModule وITriggerModule، وعرضها على DashcamManager من خلال DashcamServiceAPI.

وحدات الطبقة

تستخدم خدمة Dashcam ملف dashcam-service/res/values/config.xml لتحديد مكان العثور على عمليات تنفيذ الوحدة. يتم توفير عمليات تنفيذ تلقائية لكل وحدة. ومع ذلك، يمكن أن يتم تطبيق طبقة على كل وحدة من خلال ضبط مكوّنها في قيمة الإعداد المقابلة.

اضبط اسم مكوّن تنفيذ الشركة المصنّعة الأصلية لما يلي:

  • IRecorderModule على recording_module
  • IStreamModule على streaming_module
  • ITriggerModule على trigger_module

في وقت التشغيل، تنشئ خدمة Dashcam اسم المكوّن الذي تم ضبطه في config.xml لكل وحدة.

دليل مطوّري التطبيقات

يُعدّ تطبيق Dashcam حلاً جاهزًا للاستخدام وقابلاً للتخصيص لتسجيل الفيديو في السيارة. يستخدم تطبيق Dashcam واجهات برمجة تطبيقات "مدير Dashcam" للتواصل مع Dashcam service. يمكن العثور على واجهة برمجة تطبيقات "مدير Dashcam" في IDashcamManager. يمكن لأي تطبيق لديه الأذونات المطلوبة استخدام "مدير Dashcam".

OverlayUI

يمكن تخصيص التطبيق باستخدام الطبقات في وقت التشغيل. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة الطبقات في وقت التشغيل. للاطّلاع على قائمة العناصر القابلة للطبقة، يُرجى الاطّلاع على overlayable.xml.

تمديد المشغّلات

يمكن تمديد المشغّلات للجلسة الحالية من خلال استدعاء DashcamManager#addTrigger(). تستمر المشغّلات المضافة للجلسة الحالية فقط.

بدء تلقائي

لا تتوفّر ميزة بدء التسجيل تلقائيًا. ومع ذلك، يمكن بدء مشغِّل يدوي onBoot من خلال استدعاء DashcamManager.startRecording()

أفضل الممارسات

  • مساحة التخزين يُنصح بشدة باستخدام وحدة تخزين خارجية قابلة للإزالة.

  • تجربة المستخدم صمِّم واجهة مستخدِم تطبيق Dashcam لتكون سهلة الاستخدام وبديهية، مع الالتزام بإرشادات تصميم AAOS.

  • تحسين الأداء حسِّن أداء التطبيق لتقليل استخدام الموارد وضمان التشغيل السلس في AAOS.

تحديد المشاكل وحلّها

  • مشاكل في اتصال الكاميرا يجب أن تكون كاميرات EVS أو Camera2 متوافقة ومتاحة في نظام AAOS IVI.

  • أخطاء في مساحة التخزين تحقَّق من مساحة التخزين المتاحة وأدِر التسجيلات. يُنصح بشدة باستخدام وحدة تخزين خارجية لأنّ استخدام وحدة التخزين الداخلية يمكن أن يؤدي إلى تآكل مساحة التخزين قبل الأوان.