Integracja wideorejestratora

Aplikacja Wideorejestrator została zaprojektowana do integracji z AAOS, aby zapewnić kierowcom możliwość nagrywania filmów, co zwiększa bezpieczeństwo. Ten przewodnik zawiera wymagania techniczne, instrukcje integracji i sprawdzone metody, które pomogą Ci wdrożyć tę funkcję.

Wymagania wstępne

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

SDK:

  • Wymagany jest pakiet SDK w wersji 31 lub nowszej.

Sprzęt:

  • Kamery EVS lub Camera2 dostępne dla AAOS.
  • W przypadku nagrań wideo musi być dostępna wystarczająca ilość miejsca w pamięci wewnętrznej lub obsługa wymiennej pamięci zewnętrznej.

Wymagania dotyczące oprogramowania:

  • Oddzielna pomoc. Więcej informacji znajdziesz w sekcji Aplikacje niezależne.
  • Uprawnienia Wideorejestrator wymaga uprawnień systemowych.

Pobieranie kodu źródłowego

Wideorejestrator jest częścią aplikacji AAOS dostępnych osobno. Aby sprawdzić rozdzielony kod, zobacz Sprawdzanie kodu.

Przeglądaj kod źródłowy za pomocą wyszukiwarki kodu Androida.

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

  • Usługa wideorejestratora. Logika transmisji, nagrywania i wyzwalania.
  • Menedżer wideorejestratora Łączy się z usługą Dashcam i udostępnia klientom stabilny interfejs API.
  • Aplikacja wideorejestratora. Aplikacja wideorejestratora korzystająca z interfejsu Dashcam Manager API.

Schemat architektury

Tworzenie wideorejestratora

Do kompilacji wideorejestratora użyj Soong lub Gradle.

Soong

On Soong:

mma DashcamService DashcamManager-lib DashcamApp

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

Gradle

W przypadku Gradle:

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

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

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

Uprawnienia

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

Najprostszym sposobem przyznania tych uprawnień jest uwzględnienie ich w gotowej konfiguracji 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 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 \

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 wideorejestratora przyznaj usłudze wideorejestratora uprawnienia Camera2 zgodnie z opisem w sekcji Aparat w AAOS.

Dodaj plik wstępnie przyznanych uprawnień do pliku Blueprint lub Make w taki sam sposób jak plik uprawnień.

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 utworzonego komponentu z obrazem systemuDodawanie listy dozwolonych.

Zainstalowane przez inny program

Plik uprawnień można też wgrać z boku. Użyj tej metody, gdy gotowa kamera samochodowa nie jest skonfigurowana.

Używając pliku uprawnień utworzonego wcześniej w sekcji gotowych komponentów, uruchom:

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 podobny sposób jak w przypadku etc/default-permissions/.

Konfigurowanie nakładek

Usługa kamery samochodowej 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 /assets
  • allow_internal_storage Zezwalaj na zapisywanie nagrań w pamięci wewnętrznej
  • boot_startup_enabled Uruchamianie usługi wideorejestratora podczas włączania urządzenia
  • notifications_on Wyświetlaj powiadomienia po rozpoczęciu nagrywania
  • default_app_component domyślna aplikacja kamery samochodowej, która ma dostęp do nagrań i wyzwalaczy na całym świecie;
  • recording_module ComponentName of IRecordingModule implementation
  • streaming_module ComponentName of IStreamingModule implementation
  • trigger_module ComponentName of ITriggerModule implementation

Konfiguracja reguły

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

dashcam-service/src/assets/config.xml

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

Konfiguracja wyzwalacza składa się z pamięci, kamery i wyzwalacza:

Miejsce na dane

Konfiguracja miejsca na dane obejmuje te elementy:

  • maxStorageUsagePercent Maksymalny odsetek dostępnego miejsca na dane, który może wykorzystać kamera samochodowa przed usunięciem nagrań.

  • maxStorageUsageMegabytes Maksymalna ilość miejsca na dane w megabajtach, jaką rejestrator samochodowy wykorzystuje przed usunięciem nagrań.

  • maxAgeHoursBeforePrune Maksymalna liczba godzin przed usunięciem nagrania. Nagranie może zostać przycięte wcześniej, jeśli zostaną osiągnięte limity miejsca na dane.

Aparat

Konfiguracja kamery obejmuje te elementy:

  • Identyfikator kamery Identyfikator kamery z prefiksem kamery.

  • prerollLengthMs Długość reklamy przed filmem, która ma być przechowywana z każdym zdarzeniem.

  • width Opcjonalna szerokość bufora zwracanego przez aparat.

  • height Opcjonalna wysokość bufora zwracanego 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-sekundową reklamą przed filmem w rozdzielczości 1080p oraz identyfikator kamery Camera2:1 z 10-sekundową reklamą przed filmem o domyślnej szerokości i wysokości.

Wyzwalacz

Konfiguracja aktywatora składa się z listy aktywatorów zdefiniowanych przez te elementy:

  • name Unikalna nazwa reguły.

  • cameras identyfikatory kamer.

  • sensorPropertyID Identyfikator czujnika poprzedzony grupą czujników. Opcje prefiksu to VHAL lub SENSOR_MANAGER.

  • description Opis aktywatora wyświetlany w interfejsie.

  • recordingLengthMs Czas trwania po zdarzeniu, który ma być rejestrowany, w milisekundach.

  • sensorValueType Typ danych generowanych przez czujnik. Dostępne opcje to INT, INT_ARRAY, FLOAT, FLOAT_ARRAYBOOLEAN, STRING.

  • thresholdType Jak ocenić wartość czujnika na podstawie thresholdValue. Dostępne opcje to AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAKPEAK_HOLD.

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

  • thresholdExtra W przypadku niektórych typów progów, np. zakresu, wymagana jest dodatkowa wartość 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 wyzwalacz, w którym TriggerModule monitoruje czujnik VHAL generujący wartości całkowite. TriggerModule porównuje równość z wartością progową. Gdy warunek równości zostanie spełniony, wyzwalacz zarejestruje się na kamerach 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"/>

W tym przykładzie pokazujemy wyzwalacz, w którym TriggerModule monitoruje czujnik VHAL generujący wartości zmiennoprzecinkowe. TriggerModule porównuje średnią z czujnika z zakresu 10 próbek z wartością progową 20.0. Zakres próbki jest ustawiony 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ń.

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

Moduły nakładki

Usługa wideorejestratora używa właściwości dashcam-service/res/values/config.xml, aby określić, gdzie znaleźć implementacje modułów. Dla każdego modułu udostępniane są 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:

  • Od IRecorderModule do recording_module
  • Od IStreamModule do streaming_module
  • Od ITriggerModule do trigger_module

W czasie działania usługa Dashcam tworzy instancję nazwy komponentu ustawioną w config.xml dla każdego modułu.

Przewodnik dla deweloperów aplikacji

Wideorejestrator to gotowe do użytku produkcyjnego i konfigurowalne rozwiązanie do nagrywania jazdy. Rejestrator samochodowy korzysta z interfejsów Dashcam Manager API do komunikacji z Dashcam service. Interfejs Dashcam Manager 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 na zasoby w czasie działania. Więcej informacji znajdziesz w artykule Nakładki zasobów w czasie działania. Listę elementów, które można nakładać, znajdziesz w pliku overlayable.xml.

Rozszerzanie reguł

Wyzwalacze można przedłużyć na bieżącą sesję, wywołując funkcję DashcamManager#addTrigger(). Dodane wyzwalacze są zachowywane tylko w bieżącej sesji.

Automatyczne uruchamianie

Automatyczne uruchamianie nagrywania nie jest obsługiwane. Ręczne wyzwalanie można jednak rozpocząć onBoot wywołaniem funkcji DashcamManager.startRecording()

Sprawdzone metody

  • Miejsce na dane Zdecydowanie zalecamy korzystanie z zewnętrznej pamięci wymiennej.

  • Interfejs użytkownika Zaprojektuj interfejs aplikacji Wideorejestrator tak, aby był intuicyjny i przyjazny dla użytkownika, zgodnie z wytycznymi dotyczącymi projektowania w AAOS.

  • Optymalizacja skuteczności. Zoptymalizuj wydajność aplikacji, aby zminimalizować zużycie 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 systemie IVI AAOS.

  • Błędy pamięci. Sprawdź dostępne miejsce na dane i zarządzaj nagraniami. Zdecydowanie zalecamy korzystanie z pamięci zewnętrznej, ponieważ używanie pamięci wewnętrznej może spowodować jej przedwczesne zużycie.