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:

  • Wymaga pakietu SDK w wersji 31 lub nowszej.

Sprzęt:

  • Aparaty EVS lub Camera2 dostępne w Androida One.
  • Do nagrywania filmów musi być dostępne wystarczające miejsce na urządzeniu z pamięcią wewnętrzną lub zewnętrzną
    .

Wymagania dotyczące oprogramowania:

Pobieranie kodu źródłowego

Dashcam jest częścią niespakowanych aplikacji AAOS. Aby sprawdzić kod niespakowany, zapoznaj się z artykułem Sprawdzanie kodu.

Przeglądaj kod źródłowy za pomocą Android Code Search.

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

  • Usługa wideorejestratora. 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

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"],
}

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

W sekcji Marka:

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 \

Utwórz plik uprawnień o nazwie 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>

Dodaj uprawnienia z pliku manifestu do pliku uprawnień.

Przed użyciem Dashcam przyznaj Dashcam Service uprawnienia Camera2, jak pokazano na AAOS Camera.

Dodaj plik z uprawnieniami przyznanymi z góry do pliku Blueprint lub Make w taki sam sposób jak plik z uprawnieniami.

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

Więcej informacji znajdziesz w artykułach Integracja wstępnie utworzonej wersji w obrazie systemuDodawanie listy dozwolonych.

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 wstępnie skompilowanymi plikami:

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

Dodaj plik z uprawnieniami wstępnymi w sposób podobny do etc/default-permissions/.

Konfigurowanie nakładek

Usługa Dashcam ma konfiguracje, które można nakładać.

Konfiguracja usługi

dashcam-service/res/values/config.xml

Ten plik zawiera konfiguracje usługi:

  • config_file Nazwa pliku konfiguracji reguły w folderze /assets
  • allow_internal_storage Zezwalanie na zapisywanie nagrań w pamięci wewnętrznej
  • boot_startup_enabled Uruchomienie usługi wideorejestratora po uruchomieniu urządzenia
  • notifications_on Pokaż powiadomienia po rozpoczęciu nagrywania
  • default_app_component Domyślna aplikacja kamery samochodowej, która ma dostęp do globalnych nagrań i globalnych zdarzeń
  • recording_module NazwaKomponentu implementacji IRecordingModule
  • streaming_module NazwaKomponentu implementacji IStreamingModule
  • trigger_module NazwaKomponentu implementacji ITriggerModule

Konfiguracja reguły

Aby skonfigurować reguły nagrywania, utwórz kopię tych plików:

dashcam-service/src/assets/config.xml

i dodać go do katalogu komponentów. Wskazuj na ten plik w elemencie config_file w pliku konfiguracji usługi.

Konfiguracja reguły składa się z części dotyczących pamięci, kamery i reguły:

Miejsce na dane

Konfiguracja miejsca na dane zawiera te elementy:

  • maxStorageUsagePercent Maksymalny procent dostępnego miejsca na dane, którego używa kamera samochodowa przed przycięciem nagrań.

  • maxStorageUsageMegabytes Maksymalna ilość miejsca na dane w megabajtach, której używa kamera samochodowa przed przycięciem nagrań.

  • maxAgeHoursBeforePrune Maksymalna liczba godzin, po której nagranie zostanie usunięte. Nagranie może zostać przycięte wcześniej, jeśli zostaną osiągnięte limity miejsca na dane.

Aparat

Konfiguracja kamery zawiera te elementy:

  • Identyfikator kamery. Identyfikator kamery z prefiksem kamery.

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

  • width Opcjonalna szerokość bufora zwróconego przez kamerę.

  • height Opcjonalna wysokość bufora zwróconego przez kamerę.

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

Ten przykład pokazuje identyfikator kamery EVS:1 z 10-sekundowym prerollem w rozdzielczości 1080p oraz identyfikator kamery Camera2:1 z 10-sekundowym prerollem i domyślną szerokością i wysokością.

Wyzwalacz

Konfiguracja reguły zawiera listę reguł zdefiniowanych przez te elementy:

  • name Unikalna nazwa reguły.

  • cameras Identyfikatory kamer.

  • sensorPropertyID Identyfikator czujnika poprzedzony prefiksem grupy czujników. Dostępne opcje prefiksów to VHAL lub SENSOR_MANAGER.

  • description Opis reguły wyświetlany w interfejsie.

  • recordingLengthMs Czas trwania nagrywania po zdarzeniu w milisekundach.

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

  • thresholdType Jak ocenić wartość czujnika w porównaniu z wartością thresholdValue. Opcje: AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAKPEAK_HOLD.

  • thresholdValue Wartość porównana z wartością czujnika.

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

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

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

Ten przykład pokazuje regułę, w której TriggerModule monitoruje czujnik VHAL z wartościami całkowitymi. TriggerModule sprawdza, czy wartość jest równa wartości progowej. Gdy warunek równości jest spełniony, wyzwalacz rejestruje dane z kamer EVS 1 i 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"/>

Ten przykład pokazuje regułę, w której TriggerModule monitoruje czujnik VHAL z wartościami zmiennoprzecinkowymi. TriggerModule porównuje średnią wartość czujnika w zakresie 10 próbek z wartością progową 20.0. Zakres próbkowania jest ustawiany w thresholdExtra. Nowe zdarzenie może być wywoływane tylko co 2000 ms zgodnie z ustawieniem w parametrze triggerCooldown.

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ą definiowane w odpowiednich interfejsach: IStreamModule, IRecorderModule i ITriggerModule oraz udostępniane interfejsowi DashcamManager za pomocą interfejsu 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 dostępne są implementacje domyślne. Każdy moduł można jednak nałożyć, ustawiając jego komponent w odpowiedniej wartości konfiguracji.

Ustaw nazwę komponentu implementacji OEM:

  • Od IRecorderModule do recording_module
  • Od IStreamModule do streaming_module
  • Od ITriggerModule do 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 możliwe do dostosowania rozwiązanie do rejestrowania obrazu z przodu pojazdu. Dashcam do komunikacji z Dashcam service używa interfejsów Dashcam Manager API. Interfejs DashcamManager API znajdziesz na stronie IDashcamManager. Każda aplikacja z wymaganymi uprawnieniami może korzystać z Menedżera wideorejestratora.

OverlayUI

Aplikację można dostosować za pomocą nakładek zasobów w czasie wykonywania. 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 wyzwalacze będą obowiązywać tylko w bieżącej sesji.

Automatyczne uruchamianie

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ętrznego wymiennego urządzenia pamięci masowej.

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