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.
- Dostępna musi być wystarczająca ilość miejsca na dane na wewnętrznej pamięci urządzenia lub możliwość korzystania z wymiennej pamięci zewnętrznej
 do nagrywania filmów.
Wymagania dotyczące oprogramowania:
- Nieobsługiwana pomoc. Więcej informacji znajdziesz w artykule [GA4] Aplikacje z nieopakowanych wersji.
- Uprawnienia Dashcam wymaga uprawnień systemowych.
Pobieranie kodu źródłowego
Dashcam jest częścią niespakowanych aplikacji AAOS. Aby sprawdzić kod bez pakietu, 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 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
 
 
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 przypadku 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 uprzednio skonfigurowanym ustawieniu za pomocą szablonu 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.
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 Integracja wstępnie skompilowanego pakietu w obrazie systemu i Dodawanie 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 nakładkowe.
Konfiguracja usługi
dashcam-service/res/values/config.xml
Ten plik zawiera konfiguracje usługi:
- config_fileNazwa pliku konfiguracji reguły w- /assets
- allow_internal_storageZezwalanie na zapisywanie nagrań w pamięci wewnętrznej
- boot_startup_enabledUruchomienie usługi wideorejestratora po uruchomieniu urządzenia
- notifications_onPokaż powiadomienia po rozpoczęciu nagrywania
- default_app_componentdomyślna aplikacja rejestratora jazdy, która ma dostęp do wszystkich nagrań i do wszystkich zdarzeń,
- recording_moduleNazwaKomponentu implementacji- IRecordingModule
- streaming_moduleNazwaKomponentu implementacji- IStreamingModule
- trigger_moduleNazwaKomponentu implementacji- ITriggerModule
Konfiguracja reguły
Aby skonfigurować reguły nagrywania, utwórz kopię tych elementó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:
- maxStorageUsagePercentMaksymalny procent dostępnego miejsca na dane, którego używa kamera samochodowa przed przycięciem nagrań.
- maxStorageUsageMegabytesMaksymalna ilość miejsca na dane w megabajtach, której używa kamera samochodowa przed przycięciem nagrań.
- maxAgeHoursBeforePruneMaksymalna 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. 
- prerollLengthMsDługość wstępu reklamowego, który ma być przechowywany wraz z każdym zdarzeniem.
- widthOpcjonalna szerokość bufora zwróconego przez kamerę.
- heightOpcjonalna 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 wstępem w jakości 1080p oraz identyfikator kamery Camera2:1 z 10-sekundowym wstępem i domyślną szerokością i wysokością.
Wyzwalacz
Konfiguracja reguły zawiera listę reguł zdefiniowanych przez te elementy:
- nameUnikalna nazwa reguły.
- camerasIdentyfikatory kamer.
- sensorPropertyIDIdentyfikator czujnika poprzedzony prefiksem grupy czujników. Dostępne opcje prefiksów to- VHALlub- SENSOR_MANAGER.
- descriptionOpis reguły wyświetlany w interfejsie.
- recordingLengthMsCzas trwania nagrywania po zdarzeniu w milisekundach.
- sensorValueTypeTyp danych generowanych przez czujnik. Opcje to- INT,- INT_ARRAY,- FLOAT,- FLOAT_ARRAYi- BOOLEAN, STRING.
- thresholdTypeJak ocenić wartość czujnika w porównaniu z wartością- thresholdValue. Opcje:- AVERAGE,- BOOLEAN,- EQUALS,- LEAP,- LEAP_AVERAGE,- LEAP_OVER,- PEAKi- PEAK_HOLD.
- thresholdValueWartość porównana z wartością czujnika.
- thresholdExtraDodatkowa wartość wymagana w przypadku niektórych typów progów, takich jak zakres dla- AVERAGE.
- triggerCooldownOkres 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,- IRecorderModulei- ITriggerModuleoraz udostępniane interfejsowi- DashcamManagerza pomocą interfejsu- DashcamServiceAPI.
Moduły nakładek
Usługa Dashcam używa właściwości dashcam-service/res/values/config.xml, aby określić, gdzie znajdują się implementacje modułów. 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 IRecorderModuledorecording_module
- Od IStreamModuledostreaming_module
- Od ITriggerModuledotrigger_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 Dashcam Managera.
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 reguł na bieżącą sesję. Dodane przez Ciebie reguły 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 interfejsu 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. 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ć przedwczesne zużycie pamięci. 
