تم تصميم تطبيق 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.
الوحدات
تتألف خدمة 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 Manager للتواصل مع Dashcam  service. يمكن العثور على واجهة برمجة التطبيقات Dashcam
Manager API على الرابط IDashcamManager. يمكن لأي تطبيق لديه التصاريح المطلوبة استخدام "مدير كاميرا Dashcam".
OverlayUI
يمكن تخصيص التطبيق باستخدام "تراكبات موارد وقت التشغيل". لمزيد من المعلومات، يُرجى الاطّلاع على تراكبات الموارد أثناء التشغيل. لاطلاعك على قائمة العناصر التي يمكن تداخلها، اطّلِع على overlayable.xml.
توسيع نطاق العوامل المشغِّلة
يمكن تمديد عوامل التفعيل للجلسة الحالية من خلال طلب
إلى DashcamManager#addTrigger(). تبقى عوامل التشغيل المُضافة محفوظة للجلسة الحالية
فقط.
التشغيل التلقائي
لا تتوفّر ميزة بدء التسجيل تلقائيًا. ومع ذلك، يمكن بدؤه يدويًاonBoot من خلال طلب DashcamManager.startRecording()
أفضل الممارسات
- مساحة التخزين: ننصح بشدة باستخدام وحدة تخزين خارجية قابلة للإزالة. 
- تجربة المستخدم: يجب تصميم واجهة مستخدم تطبيق Dashcam بحيث تكون سهلة الاستخدام ومتوافقة مع إرشادات تصميم AAOS. 
- تحسين الأداء: تحسين أداء التطبيق لتقليل استخدام الموارد وضمان التشغيل السلس في نظام التشغيل AAOS 
تحديد المشاكل وحلّها
- مشاكل في الاتصال بالكاميرا: يجب أن تكون تقنية EVS أو Camera2 متوافقة ومتوفرة في واجهة برمجة التطبيقات لنظام التشغيل AAOS IVI. 
- أخطاء في مساحة التخزين: التحقّق من مساحة التخزين المتوفّرة وإدارة التسجيلات ننصحك بشدة باستخدام وحدة تخزين خارجية لأنّ استخدام وحدة التخزين الداخلية يمكن أن يؤدي إلى تلف وحدة التخزين قبل الأوان.