Dashcam'i entegre etme

Dashcam uygulaması, AAOS ile entegre olacak şekilde tasarlanmıştır. Böylece sürücülere, güvenliği ve emniyeti artırmak için video kaydı özellikleri sunar. Bu kılavuzda, başarılı bir uygulama için teknik koşullar, entegrasyon adımları ve en iyi uygulamalar özetlenmiştir.

Ön koşullar

Devam etmeden önce aşağıdaki ön koşulların karşılandığından emin olun:

SDK:

  • SDK 31 veya daha yeni bir sürüm gerekir.

Donanım:

  • AAOS'te kullanılabilen EVS veya Camera2 kameralar.
  • Video kayıtları için yeterli dahili depolama alanı veya çıkarılabilir harici depolama desteği
    olmalıdır.

Yazılım gereksinimleri:

  • Ayrı destek. Daha fazla bilgi edinmek için Paketlenmemiş Uygulamalar başlıklı makaleyi inceleyin.
  • İzinler. Dashcam için sistem izinleri gerekir.

Kaynak kodu alma

Dashcam, AAOS'in paketlenmemiş uygulamalarından biridir. Paketinden çıkarılmış kodu incelemek için Kodu inceleme başlıklı makaleyi inceleyin.

Android Code Search ile kaynak koduna göz atın.

Kaynak kodu şu üç modülde sağlanır:

  • Araç Kamerası Hizmeti. Yayınlama, kaydetme ve tetikleme mantığı.
  • Dashcam Yöneticisi Araç kamerası hizmetine bağlanır ve istemcilere kararlı bir API sunar.
  • Dashcam uygulaması. Dashcam Manager API'yi kullanan referans Dashcam uygulaması

Mimari şeması

Dashcam'i kurma

Dashcam'i oluşturmak için Soong veya Gradle'ı kullanın.

Soong

Soong'da:

mma DashcamService DashcamManager-lib DashcamApp

APK'lar out/target/product/[lunch-target]/system/priv-app/ konumunda bulunuyor.

Gradle

Gradle'da:

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

APK'lar out/aaos-apps-gradle-build/ konumunda bulunuyor.

Gradle ile araç içi kamera oluşturmayla ilgili ayrıntılı talimatlar README dosyasında verilmiştir.

İzinler

Dashcam Hizmeti ve Dashcam Uygulaması için çeşitli sistem izinleri gerekir.

Bu izinleri vermenin en basit yolu, Blueprint veya Make'i kullanarak önceden oluşturulmuş bir kuruluma dahil etmektir.

Blueprint'te:

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'te:

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 adlı bir izin dosyası oluşturun:

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

Manifest dosyasındaki izinleri izin dosyasına ekleyin.

Dashcam'i kullanmadan önce AAOS Camera'da gösterildiği gibi Dashcam Hizmeti'ne Camera2 izinlerini önceden verin.

Önceden verilmiş izinler dosyasını, izinler dosyasıyla aynı şekilde Blueprint veya Make dosyasına ekleyin.

pre-grant-permissions-com.android.car.dashcam.xml içinde:

<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 içinde:

...
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,
}

Daha fazla bilgi edinmek için Önceden oluşturulmuş bir derlemeyi sistem görüntüsüne entegre etme ve İzin verilenler listesi ekleme başlıklı makaleleri inceleyin.

Başka cihazdan yükleme

İzinler dosyası yan yükleme yöntemiyle de yüklenebilir. Hazır Dashcam yapılandırılmadığında bu yöntemi kullanın.

Daha önce önceden oluşturulmuş öğeler bölümünde oluşturulan izinler dosyasını kullanarak şu komutu çalıştırın:

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

Önceden verilmiş izinler dosyasını etc/default-permissions/'ya benzer şekilde ekleyin.

Yer paylaşımlarını yapılandırma

Araç kamerası hizmetinde yer paylaşımı yapılabilen yapılandırmalar bulunur.

Hizmet yapılandırması

dashcam-service/res/values/config.xml

Bu dosya, hizmetin yapılandırmalarını içerir:

  • config_file /assets içindeki tetikleyici yapılandırma dosyasının adı
  • allow_internal_storage Kayıtların dahili depolama alanına kaydedilmesine izin ver
  • boot_startup_enabled Cihaz açıldığında Dashcam hizmetinin başlatılması
  • notifications_on Kayıt başladığında bildirimleri göster
  • default_app_component Küresel kayıt erişimi ve küresel tetikleme erişimi olan varsayılan araç kamerası uygulaması
  • recording_module ComponentName of IRecordingModule implementation
  • streaming_module ComponentName of IStreamingModule implementation
  • trigger_module ComponentName of ITriggerModule implementation

Tetikleyici yapılandırması

Kayıt tetikleyicilerini yapılandırmak için aşağıdakilerin bir kopyasını oluşturun:

dashcam-service/src/assets/config.xml

ve bunu öğeler dizinine ekleyin. Hizmet yapılandırma dosyasındaki config_file öğesinde bu dosyayı işaret edin.

Tetikleyici yapılandırması depolama, kamera ve tetikleyici bölümlerinden oluşur:

Depolama

Depolama yapılandırması aşağıdaki öğeleri içerir:

  • maxStorageUsagePercent Kayıtları budamadan önce araç kamerasının kullandığı maksimum kullanılabilir depolama alanı yüzdesi.

  • maxStorageUsageMegabytes Kayıtları temizlemeden önce araç kamerasının kullandığı maksimum depolama alanı miktarı (megabayt).

  • maxAgeHoursBeforePrune Kayıtların kırpılmadan önceki maksimum süresi. Depolama alanı sınırlarına ulaşılırsa kayıtlar daha erken budanabilir.

Kamera

Kamera yapılandırması aşağıdaki öğeleri içerir:

  • Kamera kimliği. Kamera önekiyle birlikte kameranın kimliği.

  • prerollLengthMs Her etkinlikle birlikte depolanacak ön rulo uzunluğu.

  • width Kamera tarafından döndürülen arabelleğin isteğe bağlı genişliği.

  • height Kameranın döndürdüğü arabelleğin isteğe bağlı yüksekliği.

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

Bu örnekte, 1080p çözünürlükte 10 saniyelik bir ön rulo içeren EVS:1 kamera kimliği ve 10 saniyelik bir ön rulo ile varsayılan genişlik ve yüksekliğe sahip Camera2:1 kamera kimliği gösterilmektedir.

Tetikleyici

Tetikleyici yapılandırması, aşağıdakilerle tanımlanan bir tetikleyici listesinden oluşur:

  • name Benzersiz tetikleyici adı.

  • cameras Kameraların kimlikleri.

  • sensorPropertyID Sensör grubunun önek olarak eklendiği sensörün kimliği. Önek seçenekleri VHAL veya SENSOR_MANAGER'dir.

  • description Kullanıcı arayüzünde gösterilen tetikleyicinin açıklaması.

  • recordingLengthMs Etkinlikten sonra kaydedilecek süre (milisaniye cinsinden).

  • sensorValueType Sensörün ürettiği veri türü. Seçenekler şunlardır: INT, INT_ARRAY, FLOAT, FLOAT_ARRAY ve BOOLEAN, STRING.

  • thresholdType Sensör değerini thresholdValue ile nasıl karşılaştırabilirsiniz? Seçenekler şunlardır: AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK ve PEAK_HOLD.

  • thresholdValue Sensör değeriyle karşılaştırılan değer.

  • thresholdExtra Aralık gibi bazı eşik türleri için ek değer gerekir for AVERAGE.

  • triggerCooldown Bu türden başka bir etkinlik tetiklenmeden önce geçecek soğuma süresi (milisaniye).

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

Bu örnekte, TriggerModule'nın tam sayı değerleri üreten bir VHAL sensörünü izlediği bir tetikleyici gösterilmektedir. TriggerModule, eşitliği eşik değeriyle karşılaştırır. Eşitlik koşulu karşılandığında, 1. ve 2. EVS kameralarında kayıt tetiklenir.

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

Bu örnekte, TriggerModule öğesinin kayan değerler üreten bir VHAL sensörünü izlediği bir tetikleyici gösterilmektedir. TriggerModule, 10 örnek aralığındaki sensör ortalamasını 20.0 eşik değeriyle karşılaştırır. Örnek aralık thresholdExtra içinde ayarlanır. Yeni bir etkinlik yalnızca triggerCooldown içinde ayarlanan 2000 milisaniyede bir tetiklenebilir.

Modüller

Araç İçi Kamera Hizmeti üç modülden oluşur:

  • Stream, kameralardan gelen akışları işleme mantığını içerir.

  • Recording, kayıtları işleme mantığını içerir.

  • Tetikleyici, sensör verilerinden kayıt tetikleme mantığını içerir. Modül API'leri, ilgili arayüzlerinde (IStreamModule, IRecorderModule ve ITriggerModule) tanımlanır ve DashcamServiceAPI aracılığıyla DashcamManager'e sunulur.

Yer paylaşımı modülleri

Araç kamerası hizmeti, modül uygulamalarının nerede bulunacağını belirlemek için dashcam-service/res/values/config.xml özelliğini kullanır. Her modül için varsayılan uygulamalar sağlanır. Ancak her modül, bileşeni ilgili yapılandırma değerinde ayarlanarak yerleştirilebilir.

Aşağıdakilerin OEM uygulama bileşeni adını ayarlayın:

  • IRecorderModule-recording_module
  • IStreamModule-streaming_module
  • ITriggerModule-trigger_module

Çalışma zamanında, Dashcam hizmeti her modül için config.xml içinde ayarlanan bileşen adını oluşturur.

Uygulama geliştiricinin kılavuzu

Dashcam, üretime hazır ve özelleştirilebilir bir araç kamerası çözümüdür. Araç içi kamera, Dashcam service ile iletişim kurmak için Araç İçi Kamera Yöneticisi API'lerini kullanır. Araç kamerası yöneticisi API'sini IDashcamManager adresinde bulabilirsiniz. Gerekli izinlere sahip tüm uygulamalar Dashcam Yöneticisi'ni kullanabilir.

OverlayUI

Uygulama, çalışma zamanı kaynak katmanlarıyla özelleştirilebilir. Daha fazla bilgi için Çalışma Zamanı Kaynak Katmanları başlıklı makaleyi inceleyin. Yerleştirilebilen öğelerin listesini görmek için overlayable.xml dosyasına bakın.

Tetikleyicileri genişletme

Tetikleyiciler, DashcamManager#addTrigger() çağrısıyla mevcut oturum için uzatılabilir. Eklenen tetikleyiciler yalnızca mevcut oturumda geçerlidir.

Otomatik başlatma

Kaydı otomatik başlatma özelliği desteklenmez. Ancak manuel tetikleyici, onBoot yöntemiyle DashcamManager.startRecording() çağrılarak başlatılabilir.

En iyi uygulamalar

  • Depolama Harici çıkarılabilir depolama alanı kullanmanız önemle tavsiye edilir.

  • Kullanıcı deneyimi. AAOS tasarım yönergelerine uyarak Dashcam uygulamasının kullanıcı arayüzünü sezgisel ve kullanıcı dostu olacak şekilde tasarlayın.

  • Performans optimizasyonu. Kaynak kullanımını en aza indirmek ve AAOS'de sorunsuz çalışmasını sağlamak için uygulamanın performansını optimize edin.

Sorun giderme

  • Kamera bağlantısı sorunları. EVS veya Camera2 desteklenmeli ve AAOS IVI'de kullanılabilir olmalıdır.

  • Depolama hataları. Kullanılabilir depolama alanını doğrulayın ve kayıtları yönetin. Dahili depolama alanının kullanılması, depolama alanının erken yıpranmasına neden olabileceğinden harici depolama alanı kullanılması önemle tavsiye edilir.