Приложение Dashcam разработано для интеграции с AAOS, предоставляя водителям возможности видеозаписи для повышения безопасности. В этом руководстве изложены технические требования, шаги интеграции и передовые методы для обеспечения успешной реализации.
Предпосылки
Прежде чем продолжить, убедитесь, что выполнены следующие предварительные условия:
SDK:
- Требуется SDK 31 или выше.
Аппаратное обеспечение:
- Камеры EVS или Camera2 доступны для AAOS.
-  Достаточное внутреннее хранилище или поддержка съемного внешнего хранилища
 должны быть доступны для видеозаписи.
Требования к программному обеспечению:
- Поддержка Unbundled. Чтобы узнать больше, см. Unbundled Apps .
- Разрешения. Видеорегистратору требуются системные разрешения.
Получить исходный код
Видеорегистратор является частью AAOS unbundled apps. Чтобы проверить unbundled code, см . Check out the code .
Просмотрите исходный код с помощью Android Code Search .
Исходный код представлен в следующих трех модулях:
- Сервис видеорегистратора. Логика потоковой передачи, записи и запуска.
- Dashcam Manager. Подключается к Dashcam Service и предоставляет стабильный API клиентам.
- Приложение Dashcam. Ссылка на приложение Dashcam с использованием API Dashcam Manager

Сборка видеорегистратора
Используйте Soong или Gradle для сборки Dashcam.
Сунг
О Сунге:
mma DashcamService DashcamManager-lib DashcamApp
 APK-файлы находятся в out/target/product/[lunch-target]/system/priv-app/
Градл
На Gradle:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
 APK-файлы находятся в out/aaos-apps-gradle-build/
 Подробные инструкции по сборке Dashcam с помощью Gradle приведены в файле README .
Разрешения
Для работы сервиса Dashcam и приложения Dashcam требуются некоторые системные разрешения.
Самый простой способ предоставить эти разрешения — включить их в готовую настройку с помощью Blueprint или Make.
В проекте:
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,
}
В марке:
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 \
 Создайте файл разрешений с именем 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>
Добавьте разрешения из Манифеста в файл разрешений.
Перед использованием Dashcam предоставьте Camera2 разрешения для службы Dashcam, как показано в AAOS Camera .
Добавьте файл предварительно предоставленных разрешений в файл Blueprint или Make таким же образом, как и файл разрешений.
 В 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,
}
Дополнительную информацию см. в разделах Интеграция предварительной сборки в образ системы и Добавление списка разрешенных устройств .
Боковая загрузка
Файл разрешений также может быть загружен извне. Используйте этот метод, если предустановленная видеорегистратор не настроена.
Используя файл разрешений, созданный ранее в разделе prebuilds, запустите:
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
 Добавьте файл разрешений предварительного предоставления аналогично etc/default-permissions/ .
Настроить наложения
Сервис Dashcam имеет накладываемые конфигурации.
Конфигурация сервиса
dashcam-service/res/values/config.xml
Этот файл содержит конфигурации для сервиса:
-  config_fileИмя файла конфигурации триггера в/assets
-  allow_internal_storageРазрешить сохранение записей во внутреннем хранилище
-  boot_startup_enabledЗапуск службы видеорегистратора при загрузке устройства
-  notifications_onПоказывать уведомления при начале записи
-  default_app_componentПриложение для видеорегистратора по умолчанию, имеющее глобальный доступ к записям и глобальный доступ к триггерам.
-  recording_moduleреализацииIRecordingModule
-  streaming_moduleреализацииIStreamingModule
-  trigger_moduleИмя компонента реализацииITriggerModule
Конфигурация триггера
Чтобы настроить триггеры записи, создайте копию:
dashcam-service/src/assets/config.xml
и добавьте это в каталог assets. Укажите на этот файл в элементе config_file в файле конфигурации сервиса.
Конфигурация триггера состоит из частей хранилища, камеры и триггера:
Хранилище
Конфигурация хранилища состоит из следующих элементов:
- maxStorageUsagePercentМаксимальный процент доступной памяти, которую видеорегистратор использует перед обрезкой записей.
- maxStorageUsageMegabytesМаксимальный объем памяти в мегабайтах, который видеорегистратор использует перед обрезкой записей.
- maxAgeHoursBeforePruneМаксимальное количество часов до обрезки записи. Запись может быть обрезана раньше, если соблюдены ограничения по хранению.
Камера
Конфигурация камеры состоит из следующих элементов:
- Идентификатор камеры. Идентификатор камеры с префиксом камеры. 
- prerollLengthMsДлина преролла, сохраняемая с каждым событием.
- widthНеобязательная ширина буфера, возвращаемого камерой.
- heightНеобязательная высота буфера, возвращаемого камерой.
<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>
В этом примере показан идентификатор камеры EVS:1 с 10-секундной предварительной подкруткой при разрешении 1080p и идентификатор камеры Camera2:1 с 10-секундной предварительной подкруткой и шириной и высотой по умолчанию.
Курок
Конфигурация триггера состоит из списка триггеров, определяемых следующим образом:
- nameУникальное имя триггера.
- идентификаторы - cameras.
- sensorPropertyIDИдентификатор датчика с префиксом группы датчиков. Варианты префикса:- VHALили- SENSOR_MANAGER.
- descriptionОписание триггера, отображаемое в пользовательском интерфейсе.
- recordingLengthMsДлительность записи после события в миллисекундах.
- sensorValueTypeТип данных, выдаваемых датчиком. Возможные значения:- INT,- INT_ARRAY,- FLOAT,- FLOAT_ARRAYи- BOOLEAN, STRING.
- thresholdTypeКак оценить значение датчика относительно- thresholdValue. Варианты:- AVERAGE,- BOOLEAN,- EQUALS,- LEAP,- LEAP_AVERAGE,- LEAP_OVER,- PEAKи- PEAK_HOLD.
- thresholdValueЗначение, сравниваемое со значением датчика.
- thresholdExtraДополнительное значение, необходимое для некоторых типов порогов, таких как диапазон для- AVERAGE.
- triggerCooldownВремя охлаждения в миллисекундах перед запуском следующего события этого типа.
<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>
В этом примере показан триггер, в котором TriggerModule отслеживает датчик VHAL, выдающий целочисленные значения. TriggerModule сравнивает равенство с пороговым значением. Когда условие равенства выполняется, триггер записывает данные с камер EVS 1 и 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"/>
В этом примере показан триггер, в котором TriggerModule отслеживает датчик VHAL, выдающий значения с плавающей точкой. TriggerModule сравнивает среднее значение датчика в диапазоне 10 выборок с пороговым значением 20.0 . Диапазон выборок задается в thresholdExtra . Новое событие может быть запущено только каждые 2000 миллисекунд, как задано в triggerCooldown .
Модули
Сервис Dashcam состоит из трех модулей:
- Stream содержит логику обработки потоков с камер. 
- Запись содержит логику обработки записей. 
- Trigger содержит логику для запуска записи из данных датчика. API модуля определены в соответствующих интерфейсах - IStreamModule,- IRecorderModuleи- ITriggerModuleи предоставлены- DashcamManagerчерез- DashcamServiceAPI.
Модули наложения
 Служба Dashcam использует dashcam-service/res/values/config.xml для определения, где найти реализации модуля. Для каждого модуля предусмотрены реализации по умолчанию. Однако каждый модуль можно наложить, установив его компонент в соответствующем значении конфигурации.
Задайте имя компонента реализации OEM:
-  IRecorderModuleвrecording_module
-  IStreamModuleдляstreaming_module
-  ITriggerModuleвtrigger_module
 Во время выполнения служба Dashcam создает экземпляр имени компонента, заданного в config.xml для каждого модуля.
Руководство разработчика приложений
 Dashcam — это готовое к производству и настраиваемое решение для видеорегистраторов. Dashcam использует API Dashcam Manager для связи с Dashcam service . API Dashcam Manager можно найти по адресу IDashcamManager . Любое приложение с необходимыми разрешениями может использовать Dashcam Manager.
Оверлейный интерфейс
Приложение можно настроить с помощью Runtime Resource Overlays. Чтобы узнать больше, см. Runtime Resource Overlays . Чтобы увидеть список накладываемых элементов, см. overlayable.xml .
Расширить триггеры
 Триггеры можно расширить для текущего сеанса с помощью вызова DashcamManager#addTrigger() . Добавленные триггеры сохраняются только для текущего сеанса.
Автозапуск
 Автозапуск записи не поддерживается. Однако ручной запуск может быть запущен onBoot с вызовом DashcamManager.startRecording()
Лучшие практики
- Хранилище. Настоятельно рекомендуется использовать внешний съемный накопитель. 
- Пользовательский опыт. Разработайте пользовательский интерфейс приложения Dashcam таким образом, чтобы он был интуитивно понятным и удобным для пользователя, следуя рекомендациям AAOS по дизайну. 
- Оптимизация производительности. Оптимизируйте производительность приложения, чтобы минимизировать использование ресурсов и обеспечить бесперебойную работу в AAOS. 
Поиск неисправностей
- Проблемы с подключением камеры. EVS или Camera2 должны поддерживаться и быть доступны в AAOS IVI. 
- Ошибки хранения. Проверьте доступное место для хранения и управляйте записями. Настоятельно рекомендуется использовать внешнее хранилище, поскольку использование внутреннего хранилища может привести к преждевременному износу хранилища. 
