دمج كاميرا Dashcam

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

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

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

حزمة SDK:

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

الأجهزة:

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

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

  • الدعم غير المُضمَّن في الحزمة: لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التطبيقات التي تم إلغاء تجميعها.
  • الأذونات: يتطلّب تطبيق Dashcam الحصول على أذونات النظام.

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

تطبيق Dashcam هو جزء من التطبيقات غير المجمّعة في AAOS. للاطّلاع على الرمز غير المجمّع، اطّلِع على الاطّلاع على الرمز.

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

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

  • خدمة كاميرا Dashcam: منطق البث والتسجيل والتشغيل
  • مدير كاميرا Dashcam يتصل بخدمة كاميرا السرعة ويوفّر واجهة برمجة تطبيقات مستقرة للعملاء.
  • تطبيق Dashcam: يمكنك الرجوع إلى تطبيق Dashcam باستخدام واجهة برمجة التطبيقات Dashcam Manager API.

مخطّط البنية

إنشاء كاميرا Dashcam

استخدِم Soong أو Gradle لإنشاء تطبيق Dashcam.

سونغ

على 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,
}

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

التحميل الجانبي

يمكن أيضًا تثبيت ملف الأذونات من مصدر غير معروف. استخدِم هذه الطريقة عندما لا تكون كاميرا ال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 بدء خدمة Dashcam عند تشغيل الجهاز
  • notifications_on عرض الإشعارات عند بدء التسجيل
  • default_app_component تطبيق كاميرا داش التلقائي الذي يتيح الوصول إلى التسجيلات بشكل عام والوصول إلى عوامل التفعيل بشكل عام
  • recording_module اسم المكوّن لتنفيذ IRecordingModule
  • streaming_module اسم المكوّن لتنفيذ IStreamingModule
  • trigger_module اسم المكوّن لتنفيذ 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 وصف عامل التشغيل الذي يظهر في واجهة المستخدم

  • 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.

الوحدات

تتألف خدمة كاميرا الرؤية الخلفية من ثلاث وحدات:

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

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

  • يحتوي العامل المشغِّل على منطق بدء التسجيل من بيانات أجهزة الاستشعار. يتم تعريف واجهات برمجة تطبيقات الوحدة في واجهاتها المقابلة، وهي 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 Manager للتواصل مع Dashcam service. يمكن العثور على واجهة برمجة التطبيقات Dashcam Manager API على الرابط IDashcamManager. يمكن لأي تطبيق لديه الأذونات المطلوبة استخدام "مدير كاميرا Dashcam".

OverlayUI

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

توسيع نطاق العوامل المشغِّلة

يمكن تمديد عوامل التفعيل للجلسة الحالية من خلال طلب إلى DashcamManager#addTrigger(). تبقى عوامل التشغيل المُضافة محفوظة للجلسة الحالية فقط.

التشغيل التلقائي

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

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

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

  • تجربة المستخدم: يجب تصميم واجهة مستخدم تطبيق Dashcam بحيث تكون سهلة الاستخدام ومتوافقة مع إرشادات تصميم AAOS.

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

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

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

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