Integracja wideorejestratora

Aplikacja Dashcam została zaprojektowana z myślą o integracji z AAOS i zapewnia kierowcom możliwość nagrywania filmów w celu zwiększenia bezpieczeństwa. Ten przewodnik zawiera wymagania techniczne, kroki integracji i sprawdzone metody, które pomogą Ci w udanym wdrożeniu.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że są spełnione te warunki wstępne:

Pakiet SDK:

  • Wymagana jest wersja 31 lub nowsza pakietu SDK.

Sprzęt:

  • Aparaty EVS lub Camera2 dostępne w Androidzie AOSP.
  • Do nagrywania filmów musi być dostępne wystarczające miejsce na wewnętrznej pamięci lub pamięci zewnętrznej.

Wymagania dotyczące oprogramowania:

Pobieranie kodu źródłowego

Kod źródłowy można znaleźć w wyszukiwarce kodu Androida:

https://cs.android.com/android/platform/superproject/+/ub-automotive-master-20250219:packages/apps/Car/Dashcam/

Kod źródłowy jest dostępny w tych 3 modułach:

  • Usługa Dashcam. strumieniowanie, nagrywanie i uruchamianie logiki;
  • Menedżer Dashcam Łączy się z usługą Dashcam i udostępnia klientom stabilne interfejs API.
  • Aplikacja Dashcam. Przykładowa aplikacja Dashcam korzystająca z Dashcam Manager API

Schemat architektury

Tworzenie wideorejestratora

Użyj Soong lub Gradle do skompilowania Dashcam.

Soong

Przed kompilacją za pomocą Soong wyczyść katalogi .cxx.

W Soong:

mma DashcamService DashcamManager-lib DashcamApp

Pliki APK znajdują się w folderze out/target/product/[lunch-target]/system/priv-app/

Gradle

W Gradle:

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

Pliki APK znajdują się w folderze out/aaos-apps-gradle-build/

Szczegółowe instrukcje kompilowania Dashcam za pomocą Gradle znajdziesz w pliku README.

Uprawnienia

Usługa Dashcam i aplikacja Dashcam wymagają kilku uprawnień systemowych.

Najprostszym sposobem przyznania tych uprawnień jest uwzględnienie ich w gotowym szablonie za pomocą Blueprint lub Make.

W planie:

Android.bp
android_app_import {
    name: "DashcamApp-prebuilt",
    apk: "DashcamApp.apk",
    privileged: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.dashcam"],
}

W sekcji Make:

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/CarCatApp/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \

Utwórz plik uprawnień o nazwie allowed_privapp_com.android.car.dashcam.xml:

<permissions>
  <privapp-permissions package="com.android.car.dashcam">
      <permission name="" />
  </privapp-permissions>
  <privapp-permissions package="com.android.car.dashcam.app">
      <permission name="" />
  </privapp-permissions>
</permissions>

Dodaj uprawnienia z pliku manifestu do pliku uprawnień.

Więcej informacji znajdziesz w artykule o wstępnie utworzonych obrazach systemowych.

Instalowanie z nieoficjalnego źródła

Plik z uprawnieniami można też zainstalować ręcznie. Użyj tej metody, gdy wstępnie skonfigurowana kamera samochodowa nie jest skonfigurowana.

Użyj pliku uprawnień utworzonego wcześniej w sekcji z gotowymi rozwiązaniami:

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

Konfigurowanie nakładek

Usługa Dashcam ma konfiguracje nakładkowe.

Konfiguracja usługi

dashcam-service/res/values/config.xml

Ten plik zawiera konfiguracje usługi:

  • allow_internal_storage Zezwalanie na nagrywanie w pamięci wewnętrznej
  • save_location Nazwa katalogu, w którym mają być zapisywane nagrania. Domyślnie: dashcam
  • max_storage_mb Ile miejsca na dane ma wykorzystywać wideorejestrator
  • max_age_days Jak długo plik ma być przechowywany przed przycięciem
  • boot_startup_enabled Uruchomienie usługi wideorejestratora po uruchomieniu urządzenia
  • notifications_on Pokaż powiadomienia po rozpoczęciu nagrywania
  • native_recorder Używanie interfejsów NDK, domyślnie interfejsy Java
  • native_renderer Używanie interfejsów NDK, domyślnie interfejsy Java
  • default_app_component Domyślna aplikacja rejestratora jazdy, która ma dostęp do wszystkich nagrań i do wszystkich zdarzeń
  • recording_module ComponentName implementacji IRecordingModule
  • streaming_module ComponentName implementacji IRecordingModule
  • trigger_module ComponentName implementacji IRecordingModule

Konfigurowanie reguły

Aby uruchomić konfigurację, uruchom:

dashcam-service/src/assets/config.xml

Ten plik zawiera konfiguracje wyzwalaczy nagrywania. Konfiguracja reguły składa się z 2 części:

  • Identyfikator reklamy przed filmem. Identyfikator aparatu (EVs lub Camera2) w zależności od tego, co jest obsługiwane.

  • prerollLengthMs Długość wstępu, który ma być przechowywany wraz z każdym zdarzeniem.

<Preroll>
  <Camera
      ID="0"
      prerollLengthMs="10000" />
</Preroll>

Ten przykład pokazuje kamerę o identyfikatorze 0 z 10-sekundową reklamą przed filmem.

  • name Unikalna nazwa reguły

  • camera Identyfikator kamery (EVs lub Camera2 w zależności od tego, co jest obsługiwane)

  • sensorPropertyID Identyfikator czujnika

  • description Opis reguły wyświetlany w interfejsie

  • recordingLengthMs Czas trwania nagrywania po zdarzeniu w milisekundach.

  • sensorType Typ czujnika. Dostępne opcje to VHAL lub SENSOR_MANAGER

  • sensorValueType Typ danych generowanych przez czujnik. Opcje to INT, INT_ARRAY, FLOAT, FLOAT_ARRAY i BOOLEAN, STRING.

  • thresholdType Jak ocenić wartość czujnika. Opcje: AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK i PEAK_HOLD

  • thresholdValue Wartość, z którą porównać wartość czujnika przy danym typie progu

  • thresholdExtra Dodatkowa wartość wymagana w przypadku niektórych typów progów, takich jak zakres w przypadku AVERAGE

  • triggerCooldown Czas oczekiwania przed wywołaniem kolejnego zdarzenia tego typu w milisekundach.

<EventTriggers>
  <EventTrigger
      name="AEB"
      camera="1 2"
      sensorPropertyID="289411073"
      description="Automatic Emergency Braking"
      recordingLengthMs="20000"
      sensorType="VHAL"
      sensorValueType="INT"
      thresholdType="EQUALS"
      thresholdValue="2"
      triggerCooldown="5000"/>
</EventTriggers>

Ten przykład pokazuje czujnik VHAL, który zwraca wartości całkowite, gdzie porównujemy równość z wartością progową. Gdy warunek równości jest spełniony, wyzwalacz rejestruje w kamerach 1 i 2.

<EventTrigger
            name="SPEED"
            camera="1 2 3 4"
            sensorPropertyID="291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorType="VHAL"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="1000"
            triggerCooldown="2000"/>

Ten przykład pokazuje czujnik VHAL, który zwraca wartości zmiennoprzecinkowe. Średnią z różnych próbek porównuje się z wartością progową. Zakres próbki jest ustawiony w thresholdExtra

Moduły

Usługa Dashcam składa się z 3 modułów:

  • Stream zawiera logikę obsługi strumieni z kamer.

  • Recording zawiera logikę obsługi nagrań.

  • Wyzwalacz zawiera logikę wyzwalania nagrywania na podstawie danych z czujników. Interfejsy API modułów są zdefiniowane w odpowiednich interfejsach IStreamModule, IRecorderModuleITriggerModule oraz udostępniane interfejsowi DashcamManager za pomocą DashcamServiceAPI.

Moduły nakładek

Usługa Dashcam używa właściwości dashcam-service/res/values/config.xml do określenia, gdzie znajdują się implementacje modułu. Dla każdego modułu udostępniamy domyślne implementacje. Każdy moduł można jednak nałożyć, ustawiając jego komponent w odpowiedniej wartości konfiguracji.

  • Ustaw nazwę komponentu implementacji OEM o nazwie IRecorderModule na recording_module

  • Ustaw nazwę komponentu OEM IStreamModule na nazwę modułu strumieniowego.

  • Ustaw nazwę komponentu implementacji OEM o nazwie ITriggerModule na trigger_module

    Podczas działania usługa Dashcam tworzy instancję nazwy komponentu ustawionej w config.xml dla każdego modułu.

Przewodnik dla deweloperów aplikacji

Dashcam to gotowe do wdrożenia i dostosowywalne rozwiązanie do rejestrowania obrazu z przodu pojazdu. Wideorejestrator korzysta z interfejsów Dashcam Manager API do komunikacji z Dashcam service. Interfejs DashcamManager API znajdziesz na stronie IDashcamManager. Każda aplikacja z wymaganymi uprawnieniami może korzystać z Menedżera wideorejestratora.

Uprawnienia

Obsługiwane są Camera2 i EV.

Gotowe

Najprostszym sposobem przyznania tych uprawnień jest uwzględnienie ich w gotowym szablonie za pomocą Blueprint lub Make.

OverlayUI

Aplikację można dostosować za pomocą nakładek zasobów w czasie działania. Więcej informacji znajdziesz w artykule Nakładki zasobów w czasie wykonywania. Aby zobaczyć listę elementów, które można nakładać, otwórz plik overlayable.xml.

Rozszerzanie reguł

Korzystając z funkcji DashcamManager.addTrigger(), możesz rozszerzyć działanie wyzwalaczy na bieżącą sesję. Dodane przez Ciebie reguły będą obowiązywać tylko w bieżącej sesji.

Autostart

Nagrywanie automatyczne nie jest obsługiwane. Można jednak uruchomić onBoot za pomocą wywołania DashcamManager.startRecording()

Sprawdzone metody

  • Miejsce na dane Zdecydowanie zalecamy użycie zewnętrznej pamięci wymiennej.

  • Interfejs użytkownika. Zaprojektuj interfejs aplikacji Dashcam tak, aby był intuicyjny i przyjazny dla użytkownika, a jednocześnie zgodny ze wskazówkami dotyczącymi AAOS.

  • Optymalizacja skuteczności. Zoptymalizuj wydajność aplikacji, aby zminimalizować wykorzystanie zasobów i zapewnić płynne działanie w AAOS.

Rozwiązywanie problemów

  • Problemy z połączeniem kamery EVS lub Camera2 muszą być obsługiwane i dostępne w AAOS IVI.

  • Błędy miejsca na dane. Sprawdzanie dostępnego miejsca na dane i zarządzanie nagraniami. Zdecydowanie zalecamy korzystanie z pamięci zewnętrznej, ponieważ używanie pamięci wewnętrznej może spowodować przedwczesne zużycie pamięci.