Integracja wideorejestratora

Aplikacja wideorejestratora jest przeznaczona do integracji z AAOS, aby zapewnić kierowcom możliwość nagrywania filmów w celu zwiększenia bezpieczeństwa. Ten przewodnik zawiera wymagania techniczne, instrukcje integracji i sprawdzone metody, które pomogą Ci w prawidłowym wdrożeniu.

Wymagania wstępne

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

Pakiet SDK:

  • Wymagany jest pakiet SDK w wersji 31 lub nowszej.

Sprzęt:

  • Kamery EVS lub Camera2 dostępne w AAOS.
  • Wystarczająca ilość miejsca w pamięci wewnętrznej lub obsługa wymiennej pamięci zewnętrznej
    musi być dostępna do nagrywania filmów.

Wymagania związane z oprogramowaniem:

  • Obsługa aplikacji niezależnych. Więcej informacji znajdziesz w artykule Aplikacje niezależne.
  • Uprawnienia. Wideorejestrator wymaga uprawnień systemowych.

Pobieranie kodu źródłowego

Wideorejestrator jest częścią aplikacji niezależnych AAOS. Aby sprawdzić kod niezależny, przeczytaj artykuł 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 przesyłania strumieniowego, nagrywania i wyzwalania.
  • Menedżer wideorejestratora. Łączy się z usługą wideorejestratora i udostępnia klientom stabilny interfejs API.
  • Aplikacja wideorejestratora. Aplikacja wideorejestratora, która korzysta z interfejsu API menedżera wideorejestratora.

Diagram architektury

Kompilowanie wideorejestratora

Do kompilowania wideorejestratora użyj Soong lub Gradle.

Soong

W Soong:

mma DashcamService DashcamManager-lib DashcamApp

Pliki APK znajdują się w 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 out/aaos-apps-gradle-build/

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

Uprawnienia

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

Najprostszym sposobem na przyznanie tych uprawnień jest uwzględnienie ich w preinstalowanej konfiguracji za pomocą Blueprint lub Make.

W Blueprint:

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 manifestu do pliku uprawnień.

Zanim zaczniesz korzystać z wideorejestratora, przyznaj usłudze wideorejestratora uprawnienia Camera2, jak pokazano w AAOS Camera.

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

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

W 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 Integrowanie preinstalowanej aplikacji z obrazem systemu i Dodawanie listy dozwolonych.

Zainstalowane przez inny program

Plik uprawnień można też zainstalować przez inny program. Użyj tej metody, gdy preinstalowany wideorejestrator nie jest skonfigurowany.

Używając pliku uprawnień utworzonego wcześniej w sekcji preinstalowanych aplikacji, 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 przyznanymi uprawnieniami w podobny sposób jak etc/default-permissions/.

Konfigurowanie nakładek

Usługa wideorejestratora ma konfigurowalne nakładki.

Konfiguracja usługi

dashcam-service/res/values/config.xml

Ten plik zawiera konfiguracje usługi:

  • config_file Nazwa pliku konfiguracji aktywatora 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 wideorejestratora, która ma globalny dostęp do nagrań i globalny dostęp do aktywatorów
  • recording_module ComponentName implementacji IRecordingModule
  • streaming_module ComponentName implementacji IStreamingModule
  • trigger_module ComponentName implementacji ITriggerModule

Konfiguracja aktywatora

Aby skonfigurować aktywatory nagrywania, utwórz kopię:

dashcam-service/src/assets/config.xml

i dodaj ją do katalogu zasobów. Wskaż ten plik w elemencie config_file w pliku konfiguracji usługi.

Konfiguracja aktywatora składa się z części dotyczących miejsca na dane, aparatu i aktywatora:

Miejsce na dane

Konfiguracja miejsca na dane ma te elementy:

  • maxStorageUsagePercent Maksymalny procent dostępnego miejsca na dane, które wideorejestrator może wykorzystać przed usunięciem nagrań.

  • maxStorageUsageMegabytes Maksymalna ilość miejsca na dane w megabajtach, które wideorejestrator może wykorzystać przed usunięciem nagrań.

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

Aparat

Konfiguracja aparatu ma te elementy:

  • Identyfikator aparatu. Identyfikator aparatu z prefiksem aparatu.

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

  • width Opcjonalna szerokość bufora zwracanego przez aparat.

  • height Opcjonalna wysokość bufora zwracanego przez aparat.

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

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

Wyzwalacz

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

  • name Unikalna nazwa aktywatora.

  • cameras Identyfikatory aparatów.

  • sensorPropertyID Identyfikator czujnika z prefiksem grupy czujników. Opcje prefiksu to VHAL lub SENSOR_MANAGER.

  • description Opis aktywatora, który jest wyświetlany w interfejsie.

  • recordingLengthMs Czas po zdarzeniu, przez który ma być nagrywany film, w milisekundach.

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

  • thresholdType Sposób porównywania wartości czujnika z thresholdValue. Opcje to AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK, i PEAK_HOLD.

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

  • thresholdExtra Dodatkowa wartość wymagana w przypadku niektórych typów progów, np. zakresu dla AVERAGE.

  • triggerCooldown Czas w milisekundach, który musi upłynąć, zanim zostanie wywołane kolejne zdarzenie 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 aktywator, 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, aktywator nagrywa 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"/>

Ten przykład pokazuje aktywator, w którym TriggerModule monitoruje czujnik VHAL generujący wartości zmiennoprzecinkowe. TriggerModule porównuje średnią wartość czujnika w zakresie 10 próbek z wartością progową 20.0. Zakres próbek jest ustawiony w thresholdExtra. Nowe zdarzenie można wywołać tylko co 2000 milisekund, zgodnie z ustawieniem triggerCooldown.

Moduły

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

  • Strumień zawiera logikę obsługi strumieni z kamer.

  • Nagrywanie zawiera logikę obsługi nagrań.

  • Aktywator zawiera logikę wyzwalania nagrywania na podstawie danych z czujnika. Interfejsy API modułów są zdefiniowane w odpowiednich interfejsach: IStreamModule, IRecorderModule i ITriggerModule. Są one udostępniane DashcamManager za pomocą DashcamServiceAPI.

Moduły nakładek

Usługa wideorejestratora używa pliku dashcam-service/res/values/config.xml, aby określić, gdzie znaleźć implementacje modułów. Dla każdego modułu są dostępne domyślne implementacje. Każdy moduł można jednak zastąpić, ustawiając jego komponent w odpowiedniej wartości konfiguracji.

Ustaw nazwę komponentu implementacji OEM:

  • IRecorderModule na recording_module
  • IStreamModule na streaming_module
  • ITriggerModule na trigger_module

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

Przewodnik dla deweloperów aplikacji

Wideorejestrator to gotowe do użytku i konfigurowalne rozwiązanie. Wideorejestrator używa interfejsów API menedżera wideorejestratora do komunikacji z Dashcam service. Interfejs API menedżera wideorejestratora znajdziesz w 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 działania. Więcej informacji znajdziesz w artykule Nakładki zasobów w czasie działania. Listę elementów, które można zastąpić, znajdziesz w pliku overlayable.xml.

Rozszerzanie aktywatorów

Aktywatory można rozszerzyć na potrzeby bieżącej sesji, wywołując DashcamManager#addTrigger(). Dodane aktywatory są dostępne tylko w bieżącej sesji.

Automatyczne uruchamianie

Automatyczne uruchamianie nagrywania nie jest obsługiwane. Możesz jednak uruchomić aktywator ręcznie onBoot, wywołując DashcamManager.startRecording().

Sprawdzone metody

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

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

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

Rozwiązywanie problemów

  • Problemy z łącznością z aparatem. W AAOS IVI musi być obsługiwana i dostępna kamera EVS lub Camera2.

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