دمج كاميرا Dashcam

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

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

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

مجموعة أدوات تطوير البرامج:

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

الأجهزة:

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

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

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

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

‫Dashcam هي جزء من تطبيقات AAOS غير المجمَّعة. للاطّلاع على الرمز غير المجمَّع، يُرجى الانتقال إلى الاطّلاع على الرمز.

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

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

  • خدمة "كاميرا السيارة": منطق البث والتسجيل والتفعيل
  • تطبيق Dashcam Manager يتصل هذا التطبيق بخدمة Dashcam ويعرض واجهة برمجة تطبيقات ثابتة للعملاء.
  • تطبيق Dashcam: تطبيق Dashcam المرجعي باستخدام واجهة برمجة التطبيقات Dashcam Manager

مخطط الهندسة المعمارية

إنشاء 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.

في "المخطط":

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>

أضِف الأذونات من بيان التطبيق إلى ملف الأذونات.

قبل استخدام Dashcam، يجب منح أذونات Camera2 إلى "خدمة Dashcam" كما هو موضّح في كاميرا 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,
}

لمزيد من المعلومات، يُرجى الاطّلاع على دمج إصدار مسبق في صورة نظام وإضافة قائمة بالسماح.

التثبيت من مصدر غير معروف

يمكن أيضًا تحميل ملف الأذونات جانبًا. استخدِم هذه الطريقة عندما لا يكون تطبيق &quot;كاميرا السيارة&quot; المثبَّت مسبقًا مضبوطًا.

باستخدام ملف الأذونات الذي تم إنشاؤه في قسم "الإنشاءات المسبقة" سابقًا، نفِّذ ما يلي:

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 بدء خدمة Dashcam عند تشغيل الجهاز
  • 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 ثوانٍ وعرض وارتفاع تلقائيَين.

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"/>

يعرض هذا المثال مشغّلاً يراقب مستشعر VHAL ينتج قيمًا عائمة.TriggerModule تقارن TriggerModule متوسط قراءات المستشعر على مدى 10 عيّنات بقيمة الحدّ الأدنى 20.0. يتم ضبط نطاق العينة في thresholdExtra. لا يمكن بدء حدث جديد إلا كل 2000 ملي ثانية كما هو محدّد في triggerCooldown.

الوحدات

تتألف "خدمة كاميرا تسجيل القيادة" من ثلاث وحدات:

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

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

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

وحدات العرض على سطح الصفحة

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

اضبط اسم مكوّن التنفيذ الخاص بالمصنّع الأصلي للجهاز على:

  • من ‎IRecorderModule إلى ‎recording_module
  • من ‎IStreamModule إلى ‎streaming_module
  • من ‎ITriggerModule إلى ‎trigger_module

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

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

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

OverlayUI

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

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

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

بدء تلقائي

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

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

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

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

  • تحسين الأداء: تحسين أداء التطبيق لتقليل استخدام الموارد وضمان التشغيل السلس في نظام التشغيل Android Automotive

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

  • مشاكل في اتصال الكاميرا يجب أن تكون خدمة EVS أو Camera2 متوافقة ومتاحة في نظام المعلومات والترفيه (IVI) المستند إلى Android Automotive OS.

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