Integrar a câmera veicular

O app da câmera veicular foi projetado para se integrar ao AAOS, oferecendo aos motoristas recursos de gravação de vídeo para aumentar a segurança. Este guia descreve os requisitos técnicos, as etapas de integração e as práticas recomendadas para garantir uma implementação bem-sucedida.

Pré-requisitos

Antes de continuar, verifique se estas condições foram atendidas:

SDK:

  • O SDK 31 ou mais recente é obrigatório.

Hardware:

  • Câmeras EVS ou Camera2 disponíveis para AAOS.
  • É necessário ter espaço de armazenamento interno suficiente ou suporte para armazenamento externo removível
    para fazer gravações de vídeo.

Requisitos de software:

  • Suporte não agrupado. Para saber mais, consulte Apps desagregados.
  • Permissões. A câmera veicular precisa de permissões do sistema.

Fazer o download do código-fonte

Encontre o código-fonte na Pesquisa de código do Android em:

https://cs.android.com/android/platform/superproject/+/ub-automotive-master-20250219:packages/apps/Car/Dashcam/

O código-fonte é fornecido nestes três módulos:

  • Serviço de câmera veicular. Streaming, gravação e lógica de acionamento.
  • Gerenciador de câmera veicular. Conecta-se ao serviço de câmera veicular e expõe uma API estável para os clientes
  • App de câmera veicular: consulte o app de câmera veicular usando a API Dashcam Manager.

Diagrama da arquitetura

Criar a câmera veicular

Use o Soong ou o Gradle para criar a Dashcam.

Soong

Antes de criar no Soong, limpe os diretórios .cxx.

No Soong:

mma DashcamService DashcamManager-lib DashcamApp

Os APKs estão localizados em out/target/product/[lunch-target]/system/priv-app/

Gradle

No Gradle:

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

Os APKs estão localizados em out/aaos-apps-gradle-build/

Instruções detalhadas para criar a Dashcam com o Gradle estão disponíveis no arquivo README.

Permissões

Várias permissões do sistema são necessárias para o serviço e o app da câmera veicular.

A maneira mais simples de conceder essas permissões é incluí-las em uma configuração pré-criada usando o Blueprint ou o Make.

No blueprint:

Android.bp
android_app_import {
    name: "DashcamApp-prebuilt",
    apk: "DashcamApp.apk",
    privileged: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.dashcam"],
}

Em "Criar":

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/CarCatApp/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \

Crie um arquivo de permissões com o nome allowed_privapp_com.android.car.dashcam.xml:

<permissions>
  <privapp-permissions package="com.android.car.dashcam">
      <permission name="" />
  </privapp-permissions>
  <privapp-permissions package="com.android.car.dashcam.app">
      <permission name="" />
  </privapp-permissions>
</permissions>

Adicione permissões do manifesto ao arquivo de permissões.

Para saber mais, consulte Prebuilt em uma imagem do sistema.

Sideload

O arquivo de permissões também pode ser transferido. Use esse método quando a dashcam pré-criada não estiver configurada.

Usando o arquivo de permissões criado na seção de pré-criações, execute:

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

Configurar sobreposições

O serviço de câmera de painel tem configurações sobrepostas.

Configuração do serviço

dashcam-service/res/values/config.xml

Esse arquivo contém as configurações do serviço:

  • allow_internal_storage Permitir gravações no armazenamento interno
  • save_location O nome do diretório para salvar gravações. O padrão é câmera de painel.
  • max_storage_mb Quanto armazenamento para permitir que a câmera veicular use
  • max_age_days Por quanto tempo manter um arquivo antes da poda
  • boot_startup_enabled O serviço da câmera veicular é iniciado na inicialização do dispositivo
  • notifications_on Mostrar notificações quando a gravação começar
  • native_recorder Usar APIs do NDK, padrão para APIs Java
  • native_renderer Usar APIs do NDK, padrão para APIs Java
  • default_app_component O app padrão da câmera veicular, que tem acesso a gravações globais e a acionamentos globais
  • recording_module ComponentName da implementação de IRecordingModule
  • streaming_module ComponentName da implementação de IRecordingModule
  • trigger_module ComponentName da implementação de IRecordingModule

Configurar um acionador

Para acionar a configuração, execute:

dashcam-service/src/assets/config.xml

Esse arquivo contém configurações para gravar acionadores. A configuração do gatilho consiste em duas partes:

  • ID do anúncio precedente. O ID da câmera, EVS ou Camera2, dependendo do suporte.

  • prerollLengthMs Duração do pré-roll armazenado com cada evento.

<Preroll>
  <Camera
      ID="0"
      prerollLengthMs="10000" />
</Preroll>

Este exemplo mostra o ID da câmera 0 com um pré-rolagem de 10 segundos.

  • name O nome exclusivo do acionador

  • camera ID da câmera, EVS ou Camera2, dependendo do que tiver suporte

  • sensorPropertyID ID do sensor

  • description Descrição do gatilho exibido na interface

  • recordingLengthMs Duração após o evento a ser gravada em milissegundos.

  • sensorType Qual tipo de sensor. As opções são VHAL ou SENSOR_MANAGER.

  • sensorValueType Tipo de dados produzidos pelo sensor. As opções são INT, INT_ARRAY, FLOAT, FLOAT_ARRAY e BOOLEAN, STRING.

  • thresholdType Como avaliar o valor do sensor. As opções são AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK e PEAK_HOLD.

  • thresholdValue O valor a ser comparado com o valor do sensor e o tipo de limite

  • thresholdExtra Valor extra necessário para alguns tipos de limite, como o intervalo para AVERAGE

  • triggerCooldown Tempo de espera antes de acionar outro evento desse tipo em milissegundos.

<EventTriggers>
  <EventTrigger
      name="AEB"
      camera="1 2"
      sensorPropertyID="289411073"
      description="Automatic Emergency Braking"
      recordingLengthMs="20000"
      sensorType="VHAL"
      sensorValueType="INT"
      thresholdType="EQUALS"
      thresholdValue="2"
      triggerCooldown="5000"/>
</EventTriggers>

Este exemplo mostra um sensor VHAL que produz valores inteiros em que comparamos uma igualdade com o valor de limite. Quando a condição de igualdade é atendida, um acionador grava nas câmeras 1 e 2.

<EventTrigger
            name="SPEED"
            camera="1 2 3 4"
            sensorPropertyID="291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorType="VHAL"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="1000"
            triggerCooldown="2000"/>

Este exemplo mostra um sensor VHAL que produz valores flutuantes em que avaliamos a média de uma faixa de amostras em relação ao valor de limite. O intervalo de amostragem é definido em thresholdExtra

Módulos

O serviço de câmera de painel consiste em três módulos:

  • Stream contém a lógica para processar streams de câmeras.

  • Recording contém a lógica para processar gravações.

  • Trigger contém a lógica para acionar uma gravação com base nos dados do sensor. As APIs do módulo são definidas nas interfaces correspondentes, IStreamModule, IRecorderModule e ITriggerModule, e expostas ao DashcamManager por DashcamServiceAPI.

Módulos de sobreposição

O serviço de câmera de painel usa dashcam-service/res/values/config.xml para determinar onde encontrar as implementações do módulo. Oferecemos implementações padrão para cada módulo. No entanto, cada módulo pode ser sobreposto definindo o componente no valor de configuração correspondente.

  • Definir o nome do componente de implementação OEM de IRecorderModule como recording_module

  • O nome do componente de implementação OEM de IStreamModule foi definido como o módulo de streaming.

  • Definir o nome do componente de implementação OEM de ITriggerModule como trigger_module

    No momento da execução, o serviço da câmera de ré instancia o nome do componente definido em config.xml para cada módulo.

Guia para desenvolvedores de apps

A câmera veicular é uma solução e personalizável pronta para produção. A câmera usa as APIs do Dashcam Manager para se comunicar com Dashcam service. A API Dashcam Manager pode ser encontrada em IDashcamManager. Qualquer app com as permissões necessárias pode usar o Gerenciador de câmera de ré.

Permissões

O Camera2 e o EVS são compatíveis.

Pré-criado

A maneira mais fácil de conceder essas permissões é incluí-las na configuração pré-criada usando o Blueprint ou o Make.

OverlayUI

O app pode ser personalizado com sobreposições de recursos do ambiente de execução. Para saber mais, consulte Sobreposições de recursos de execução. Para acessar a lista de elementos sobreponíveis, consulte overlayable.xml.

Acionar gatilhos

Os gatilhos podem ser estendidos para a sessão atual com uma chamada para DashcamManager.addTrigger(). Os acionadores adicionados são mantidos apenas para a sessão atual.

Início automático

A gravação com início automático não é compatível. No entanto, um acionador manual pode ser iniciado onBoot com uma chamada para DashcamManager.startRecording()

Práticas recomendadas

  • Armazenamento. O armazenamento removível externo é altamente recomendado.

  • Experiência do usuário. Projete a interface do app Dashcam para ser intuitiva e fácil de usar, seguindo as diretrizes de design do AAOS.

  • Otimização de desempenho. Otimize o desempenho do app para minimizar o uso de recursos e garantir uma operação tranquila no AAOS.

Solução de problemas

  • Problemas de conectividade da câmera. O EVS ou o Camera2 precisam ter suporte e estar disponíveis no AAOS IVI.

  • Erros de armazenamento. Verifique o espaço de armazenamento disponível e gerencie as gravações. O armazenamento externo é altamente recomendado, já que o uso do armazenamento interno pode causar desgaste prematuro.