Dashcam को इंटिग्रेट करना

Dashcam ऐप्लिकेशन को AAOS के साथ इंटिग्रेट करने के लिए डिज़ाइन किया गया है. इससे ड्राइवरों को वीडियो रिकॉर्ड करने की सुविधा मिलती है, ताकि वे ज़्यादा सुरक्षित रहें. इस गाइड में, तकनीकी ज़रूरी शर्तों, इंटिग्रेशन के चरणों, और सबसे सही तरीकों के बारे में बताया गया है. इससे यह पक्का किया जा सकता है कि इसे सही तरीके से लागू किया गया हो.

ज़रूरी शर्तें

जारी रखने से पहले, पक्का करें कि ये ज़रूरी शर्तें पूरी हों:

एसडीके:

  • SDK 31 या इसके बाद का वर्शन ज़रूरी है.

हार्डवेयर:

  • AAOS के लिए उपलब्ध ईवीएस या Camera2 कैमरे.
  • वीडियो रिकॉर्डिंग के लिए, डिवाइस के स्टोरेज में ज़रूरत के मुताबिक जगह होनी चाहिए या रिमूवेबल बाहरी स्टोरेज की सुविधा उपलब्ध होनी चाहिए
    चाहिए.

सॉफ़्टवेयर से जुड़ी ज़रूरी शर्तें:

  • अनबंडल्ड सहायता. ज़्यादा जानने के लिए, अनबंडल्ड ऐप्लिकेशन देखें.
  • अनुमतियां पर टैप करें. Dashcam को सिस्टम की अनुमतियां चाहिए.

सोर्स कोड पाना

Dashcam, AAOS के अनबंडल्ड ऐप्लिकेशन का हिस्सा है. अनबंडल किए गए कोड को देखने के लिए, कोड देखें पर जाएं.

Android Code Search की मदद से सोर्स कोड ब्राउज़ करें.

सोर्स कोड इन तीन मॉड्यूल में दिया गया है:

  • Dashcam Service. स्ट्रीमिंग, रिकॉर्डिंग, और ट्रिगर करने का लॉजिक.
  • Dashcam Manager. यह Dashcam Service से कनेक्ट होता है और क्लाइंट को स्टेबल एपीआई उपलब्ध कराता है
  • Dashcam ऐप्लिकेशन. Dashcam Manager API का इस्तेमाल करके, Dashcam ऐप्लिकेशन को रेफ़रंस करें

आर्किटेक्चर डायग्राम

Dashcam बिल्ड करना

Dashcam बनाने के लिए, Soong या Gradle का इस्तेमाल करें.

सूंग

सूनग के बारे में:

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/ में मौजूद हैं

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 का इस्तेमाल करने से पहले, Dashcam Service को Camera2 की अनुमतियां दें. इसके लिए, AAOS Camera में दिया गया तरीका अपनाएं.

अनुमतियों वाली फ़ाइल की तरह ही, पहले से मिली अनुमतियों वाली फ़ाइल को ब्लूप्रिंट या मेक फ़ाइल में जोड़ें.

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

इस उदाहरण में, 1080 पिक्सल रिज़ॉल्यूशन वाले 10 सेकंड के प्रीरोल के साथ कैमरा आईडी EVS:1 और 10 सेकंड के प्रीरोल के साथ कैमरा आईडी Camera2:1 दिखाया गया है. इसमें चौड़ाई और ऊंचाई डिफ़ॉल्ट रूप से सेट है.

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, पूर्णांक वैल्यू जनरेट करने वाले वीएचएएल सेंसर को मॉनिटर करता है. TriggerModule थ्रेशोल्ड वैल्यू के बराबर होने की तुलना करता है. समानता की शर्त पूरी होने पर, ट्रिगर ईवीएस कैमरा 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, फ़्लोट वैल्यू जनरेट करने वाले वीएचएएल सेंसर की निगरानी करता है. TriggerModule, 10 सैंपल की रेंज में सेंसर के औसत की तुलना 20.0 की थ्रेशोल्ड वैल्यू से करता है. सैंपल की रेंज thresholdExtra में सेट की जाती है. नया इवेंट, triggerCooldown में सेट किए गए 2000 मिलीसेकंड के बाद ही ट्रिगर किया जा सकता है.

मॉड्यूल

Dashcam सेवा में तीन मॉड्यूल होते हैं:

  • Stream में, कैमरों से स्ट्रीम को मैनेज करने का लॉजिक होता है.

  • Recording में रिकॉर्डिंग को मैनेज करने का लॉजिक होता है.

  • ट्रिगर में, सेंसर के डेटा से रिकॉर्डिंग ट्रिगर करने का लॉजिक होता है. मॉड्यूल एपीआई, उनके इंटरफ़ेस IStreamModule, IRecorderModule, और ITriggerModule में तय किए जाते हैं. साथ ही, DashcamServiceAPI के ज़रिए DashcamManager को दिखाए जाते हैं.

ओवरले मॉड्यूल

Dashcam Service, dashcam-service/res/values/config.xml का इस्तेमाल करके यह पता लगाती है कि मॉड्यूल के लागू होने की जानकारी कहां मिलेगी. हर मॉड्यूल के लिए, डिफ़ॉल्ट तौर पर लागू करने की सुविधा उपलब्ध होती है. हालांकि, हर मॉड्यूल को ओवरले किया जा सकता है. इसके लिए, उसके कॉम्पोनेंट को कॉन्फ़िगरेशन वैल्यू में सेट करना होगा.

इनके लिए, ओईएम के लागू किए गए कॉम्पोनेंट का नाम सेट करें:

  • IRecorderModule से recording_module
  • IStreamModule से streaming_module
  • ITriggerModule से trigger_module

रनटाइम के दौरान, Dashcam सेवा हर मॉड्यूल के लिए, config.xml में सेट किए गए कॉम्पोनेंट के नाम को इंस्टैंशिएट करती है.

ऐप्लिकेशन डेवलपर के लिए गाइड

Dashcam, प्रोडक्शन के लिए तैयार और ज़रूरत के मुताबिक बनाया जा सकने वाला डैशकैम समाधान है. डैशकैम, Dashcam service से कम्यूनिकेट करने के लिए Dashcam Manager API का इस्तेमाल करता है. DashcamManager API को IDashcamManager पर देखा जा सकता है. ज़रूरी अनुमतियां रखने वाला कोई भी ऐप्लिकेशन, Dashcam Manager का इस्तेमाल कर सकता है.

OverlayUI

ऐप्लिकेशन को रनटाइम रिसोर्स ओवरले के साथ पसंद के मुताबिक बनाया जा सकता है. ज़्यादा जानने के लिए, रनटाइम रिसॉर्स ओवरले देखें. ओवरले किए जा सकने वाले एलिमेंट की सूची देखने के लिए, overlayable.xml देखें.

ट्रिगर बढ़ाना

DashcamManager#addTrigger() को कॉल करके, मौजूदा सेशन के लिए ट्रिगर को बढ़ाया जा सकता है. जोड़े गए ट्रिगर सिर्फ़ मौजूदा सेशन के लिए सेव होते हैं.

अपने-आप शुरू होने की सुविधा

रिकॉर्डिंग अपने-आप शुरू होने की सुविधा काम नहीं करती. हालांकि, मैन्युअल ट्रिगर को onBoot पर कॉल करके DashcamManager.startRecording() शुरू किया जा सकता है

सबसे सही तरीके

  • स्टोरेज. हमारा सुझाव है कि आप बाहरी स्टोरेज का इस्तेमाल करें.

  • उपयोगकर्ता अनुभव. डैशकैम ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को इस तरह से डिज़ाइन करें कि वह सहज और इस्तेमाल में आसान हो. साथ ही, AAOS के डिज़ाइन से जुड़ी गाइडलाइन का पालन करता हो.

  • परफ़ॉर्मेंस को ऑप्टिमाइज़ करना. ऐप्लिकेशन की परफ़ॉर्मेंस को ऑप्टिमाइज़ करें, ताकि संसाधन का इस्तेमाल कम से कम हो. साथ ही, यह पक्का करें कि AAOS में ऐप्लिकेशन सही तरीके से काम करे.

समस्या का हल

  • कैमरे को कनेक्ट करने से जुड़ी समस्याएं. AAOS IVI में ईवीएस या Camera2 की सुविधा उपलब्ध होनी चाहिए और यह काम करनी चाहिए.

  • स्टोरेज से जुड़ी गड़बड़ियां. उपलब्ध स्टोरेज की पुष्टि करें और रिकॉर्डिंग मैनेज करें. बाहरी स्टोरेज का इस्तेमाल करने का सुझाव दिया जाता है, क्योंकि इंटरनल स्टोरेज का इस्तेमाल करने से स्टोरेज की क्षमता समय से पहले कम हो सकती है.