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

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

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

आगे बढ़ने से पहले, पक्का करें कि ये शर्तें पूरी हों:

एसडीके:

  • एसडीके 31 या उससे ज़्यादा का वर्शन ज़रूरी है.

हार्डवेयर:

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

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

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

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

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

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

सोर्स कोड, इन तीन मॉड्यूल में उपलब्ध है:

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

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

Dashcam बनाना

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

Soong

Soong पर:

mma DashcamService DashcamManager-lib DashcamApp

एपीके, out/target/product/[lunch-target]/system/priv-app/ में मौजूद होते हैं

Gradle

Gradle पर:

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

एपीके, out/aaos-apps-gradle-build/ में मौजूद होते हैं

Dashcam को Gradle की मदद से बनाने के बारे में पूरी जानकारी, README फ़ाइल में दी गई है.

अनुमतियां

Dashcam की सेवा और Dashcam ऐप्लिकेशन के लिए, सिस्टम की कई अनुमतियां ज़रूरी होती हैं.

इन अनुमतियों को देने का सबसे आसान तरीका है कि इन्हें पहले से बने सेटअप में शामिल किया जाए. इसके लिए, ब्लूप्रिंट या 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 की सेवा को Camera2 की अनुमतियां दें. इसके लिए, AAOS के कैमरे में दिया गया तरीका अपनाएं.

पहले से दी गई अनुमतियों वाली फ़ाइल को, ब्लूप्रिंट या 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 की सेवा में, ओवरले किए जा सकने वाले कॉन्फ़िगरेशन होते हैं.

सेवा का कॉन्फ़िगरेशन

dashcam-service/res/values/config.xml

इस फ़ाइल में, सेवा के लिए कॉन्फ़िगरेशन शामिल होते हैं:

  • config_file /assets में मौजूद, ट्रिगर कॉन्फ़िगरेशन फ़ाइल का नाम
  • allow_internal_storage रिकॉर्डिंग को डिवाइस के स्टोरेज में सेव करने की अनुमति
  • boot_startup_enabled डिवाइस के बूट होने पर, Dashcam की सेवा शुरू होना
  • notifications_on रिकॉर्डिंग शुरू होने पर सूचनाएं दिखाना
  • default_app_component डिफ़ॉल्ट Dashcam ऐप्लिकेशन. इसके पास, रिकॉर्डिंग और ट्रिगर को ऐक्सेस करने की ग्लोबल अनुमति होती है
  • recording_module IRecordingModule को लागू करने वाले कॉम्पोनेंट का नाम
  • streaming_module IStreamingModule को लागू करने वाले कॉम्पोनेंट का नाम
  • trigger_module ITriggerModule को लागू करने वाले कॉम्पोनेंट का नाम

ट्रिगर कॉन्फ़िगर करना

रिकॉर्डिंग ट्रिगर कॉन्फ़िगर करने के लिए, इसकी कॉपी बनाएं:

dashcam-service/src/assets/config.xml

और इसे ऐसेट डायरेक्ट्री में जोड़ें. सेवा के कॉन्फ़िगरेशन वाली फ़ाइल में मौजूद, config_file एलिमेंट में इस फ़ाइल की ओर इशारा करें.

ट्रिगर कॉन्फ़िगरेशन में, स्टोरेज, कैमरा, और ट्रिगर के हिस्से शामिल होते हैं:

स्टोरेज

स्टोरेज कॉन्फ़िगरेशन में ये एलिमेंट शामिल होते हैं:

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

  • maxStorageUsageMegabytes स्टोरेज की वह ज़्यादा से ज़्यादा मात्रा (मेगाबाइट में) जिसका इस्तेमाल, Dashcam रिकॉर्डिंग को हटाने से पहले करता है.

  • maxAgeHoursBeforePrune रिकॉर्डिंग को हटाने से पहले, ज़्यादा से ज़्यादा कितने घंटे तक सेव करके रखा जा सकता है. अगर स्टोरेज की सीमाएं पूरी हो जाती हैं, तो रिकॉर्डिंग को पहले भी हटाया जा सकता है.

कैमरा

कैमरा कॉन्फ़िगरेशन में ये एलिमेंट शामिल होते हैं:

  • कैमरा आईडी. कैमरा प्रीफ़िक्स के साथ कैमरे का आईडी.

  • prerollLengthMs हर इवेंट के साथ सेव किए जाने वाले प्रिरोल की अवधि.

  • width कैमरे से लौटाए गए बफ़र की वैकल्पिक चौड़ाई.

  • height कैमरे से लौटाए गए बफ़र की वैकल्पिक ऊंचाई.

<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>

इस उदाहरण में, कैमरा आईडी EVS:1 को 1080p पर 10 सेकंड के प्रिरोल के साथ दिखाया गया है. साथ ही, कैमरा आईडी 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 में सेट की जाती है. triggerCooldown में सेट की गई वैल्यू के मुताबिक, हर 2000 मिलीसेकंड में सिर्फ़ एक नया इवेंट ट्रिगर किया जा सकता है.

मॉड्यूल

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

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

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

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

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

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

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

  • IRecorderModule को recording_module पर सेट करें
  • IStreamModule को streaming_module पर सेट करें
  • ITriggerModule को trigger_module पर सेट करें

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

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

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

OverlayUI

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

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

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

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

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

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

  • स्टोरेज. बाहरी स्टोरेज का इस्तेमाल करने की सलाह दी जाती है.

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

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

समस्या का हल

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

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