تم تصميم تطبيق 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,
}
لمزيد من المعلومات، يُرجى الاطّلاع على دمج إصدار مسبق في صورة نظام وإضافة قائمة بالسماح.
التثبيت من مصدر غير معروف
يمكن أيضًا تحميل ملف الأذونات جانبًا. استخدِم هذه الطريقة عندما لا يكون تطبيق "كاميرا السيارة" المثبَّت مسبقًا مضبوطًا.
باستخدام ملف الأذونات الذي تم إنشاؤه في قسم "الإنشاءات المسبقة" سابقًا، نفِّذ ما يلي:
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اسم ملف إعدادات المشغِّل في/assetsallow_internal_storageالسماح بحفظ التسجيلات في وحدة التخزين الداخليةboot_startup_enabledبدء خدمة Dashcam عند تشغيل الجهازnotifications_onعرض الإشعارات عند بدء التسجيلdefault_app_componentتطبيق كاميرا السيارة التلقائي الذي يتيح الوصول إلى التسجيلات وإمكانية تشغيلها على مستوى العالم-
recording_moduleComponentName لتنفيذIRecordingModule -
streaming_moduleComponentName لتنفيذIStreamingModule -
trigger_moduleComponentName لتنفيذ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.
أخطاء في مساحة التخزين: تحقَّق من مساحة التخزين المتاحة وأدِر التسجيلات. ننصح بشدة باستخدام وحدة تخزين خارجية لأنّ استخدام وحدة التخزين الداخلية قد يؤدي إلى تلفها قبل الأوان.