Интегрируйте видеорегистратор

Приложение Dashcam разработано для интеграции с AAOS, предоставляя водителям возможности видеозаписи для повышения безопасности. В этом руководстве описаны технические требования, этапы интеграции и рекомендации для успешного внедрения.

Предпосылки

Прежде чем продолжить, убедитесь, что выполнены следующие предварительные условия:

SDK:

  • Требуется SDK 31 или выше.

Аппаратное обеспечение:

  • Камеры EVS или Camera2 доступны для AAOS.
  • Достаточное внутреннее хранилище или поддержка съемного внешнего хранилища
    должны быть доступны для видеозаписи.

Требования к программному обеспечению:

Получить исходный код

Видеорегистратор входит в состав отдельных приложений AAOS. Чтобы ознакомиться с отдельным кодом, см. раздел «Проверить код» .

Просмотрите исходный код с помощью Android Code Search .

Исходный код предоставлен в следующих трех модулях:

  • Сервис видеорегистраторов. Логика потоковой передачи, записи и запуска.
  • Менеджер видеорегистраторов. Подключается к сервису видеорегистраторов и предоставляет клиентам стабильный 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>

Добавьте разрешения из Манифеста в файл разрешений.

Перед использованием видеорегистратора предоставьте Camera2 разрешения службе видеорегистратора, как показано в 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

и добавьте его в каталог ресурсов. Укажите этот файл в элементе 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.

Оверлейный интерфейс

Приложение можно настраивать с помощью наложений ресурсов времени выполнения. Подробнее см. в разделе «Наложения ресурсов времени выполнения» . Список накладываемых элементов см. в файле overlayable.xml .

Расширить триггеры

Триггеры можно расширить для текущего сеанса с помощью вызова DashcamManager#addTrigger() . Добавленные триггеры сохраняются только для текущего сеанса.

Автозапуск

Автоматический запуск записи не поддерживается. Однако можно запустить запись вручную onBoot вызвав DashcamManager.startRecording()

Лучшие практики

  • Хранилище. Настоятельно рекомендуется использовать внешний съёмный накопитель.

  • Пользовательский интерфейс. Разработайте интуитивно понятный и удобный пользовательский интерфейс приложения Dashcam в соответствии с рекомендациями AAOS.

  • Оптимизация производительности. Оптимизируйте производительность приложения, чтобы минимизировать потребление ресурсов и обеспечить бесперебойную работу в AAOS.

Поиск неисправностей

  • Проблемы с подключением камеры. EVS или Camera2 должны поддерживаться и быть доступны в AAOS IVI.

  • Ошибки хранилища. Проверьте доступное место на диске и управляйте записями. Настоятельно рекомендуется использовать внешнее хранилище, поскольку использование внутреннего хранилища может привести к преждевременному износу.