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

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

Предварительные требования

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

SDK:

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

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

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

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

  • Поддержка отдельных приложений. Для получения дополнительной информации см. раздел «Отдельные приложения» .
  • Права доступа. Видеорегистратору требуются системные права доступа.

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

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

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

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

  • Сервис видеорегистраторов. Потоковая передача, запись и логика запуска.
  • Менеджер видеорегистраторов. Подключается к сервису видеорегистраторов и предоставляет клиентам стабильный API.
  • Приложение «Видеорегистратор». Используйте API «Менеджер видеорегистратора» для связи с приложением «Видеорегистратор».

Архитектурная схема

Собрать видеорегистратор

Используйте Soong или Gradle для сборки видеорегистратора.

Сунг

Он Сун:

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/

Подробные инструкции по сборке видеорегистратора с помощью Gradle приведены в файле README .

Разрешения

Для работы службы видеорегистратора и приложения видеорегистратора требуется ряд системных разрешений.

Самый простой способ предоставить эти разрешения — включить их в предварительно настроенную среду с помощью Blueprint или Make.

В проекте 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,
}

В 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 \

Создайте файл разрешений с именем 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,
}

Для получения дополнительной информации см. разделы «Интеграция предварительно собранной системы в образ системы» и «Добавление списка разрешенных устройств ».

Боковая загрузка

Файл разрешений также можно загрузить вручную. Используйте этот метод, если предустановленный видеорегистратор не настроен.

Используя файл разрешений, созданный ранее в разделе предварительно собранных компонентов, выполните следующую команду:

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-service/res/values/config.xml

Этот файл содержит конфигурации для сервиса:

  • config_file имя файла конфигурации триггера в каталоге /assets
  • allow_internal_storage Разрешить сохранение записей во внутреннюю память
  • boot_startup_enabled Служба видеорегистратора запускается при загрузке устройства
  • notifications_on Отображать уведомления при начале записи
  • default_app_component приложение видеорегистратора по умолчанию, имеющее глобальный доступ к записи и глобальный доступ к запуску записи.
  • recording_module ComponentName of IRecordingModule implementation
  • streaming_module ComponentName реализации IStreamingModule
  • trigger_module ComponentName of ITriggerModule implementation

Конфигурация триггера

Для настройки триггеров записи создайте копию следующего файла:

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>

В этом примере показана камера с ID EVS:1 с 10-секундным прероллом в разрешении 1080p и камера с ID 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 дополнительное значение, необходимое для некоторых типов пороговых значений, например, для параметра range в значении 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 .

Модули

Сервис видеорегистратора состоит из трех модулей:

  • Класс Stream содержит логику для обработки потоков данных с камер.

  • В модуле записи содержится логика обработки записей.

  • Модуль Trigger содержит логику для запуска записи на основе данных с датчиков. API модуля определены в соответствующих интерфейсах IStreamModule , IRecorderModule и ITriggerModule и доступны для DashcamManager через DashcamServiceAPI .

Модули наложения

Сервис видеорегистратора использует dashcam-service/res/values/config.xml для определения места расположения реализаций модулей. Для каждого модуля предоставляются реализации по умолчанию. Однако каждый модуль может быть переопределен путем установки его компонента в соответствующем значении конфигурации.

Укажите название компонента реализации OEM:

  • IRecorderModule в recording_module
  • IStreamModule для streaming_module
  • ITriggerModule в trigger_module

Во время выполнения служба видеорегистратора создает экземпляр компонента с именем, заданным в 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.

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