تم تصميم تطبيق 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.
أخطاء في مساحة التخزين: التحقّق من مساحة التخزين المتوفّرة وإدارة التسجيلات ننصحك بشدة باستخدام وحدة تخزين خارجية لأنّ استخدام وحدة التخزين الداخلية يمكن أن يؤدي إلى تلف وحدة التخزين قبل الأوان.