Integrar a câmera veicular

O app Câmera veicular foi desenvolvido 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 pré-condições foram atendidas:

SDK:

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

Hardware:

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

Requisitos de software:

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

Fazer o download do código-fonte

A dashcam faz parte dos apps desagrupados do AAOS. Para conferir o código não agrupado, consulte Conferir o código.

Navegue pelo código-fonte com o Android Code Search.

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

  • Serviço de câmera veicular. Lógica de streaming, gravação e acionamento.
  • Gerenciador de câmera veicular. Conecta-se ao serviço de dashcam e expõe uma API estável aos clientes.
  • App de câmera veicular. Consulte o aplicativo de câmera veicular usando a API Dashcam Manager.

Diagrama da arquitetura

Criar uma câmera veicular

Use o Soong ou o Gradle para criar o Dashcam.

Soong

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 o 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 de câmera veicular.

A maneira mais direta de conceder essas permissões é incluí-las em uma configuração pré-criada usando Blueprint ou 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"],
}

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,
}

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

Crie um arquivo de permissões chamado 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>

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

Antes de usar a câmera veicular, conceda permissões do Camera2 ao serviço de câmera veicular, conforme mostrado em Câmera do AAOS.

Adicione o arquivo de permissões pré-concedidas ao arquivo Blueprint ou Make da mesma forma que o arquivo de permissões.

Em 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>

Em 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,
}

Para saber mais, consulte Integrar um pré-build a uma imagem do sistema e Adicionar uma lista de permissões.

Sideload

O arquivo de permissões também pode ser transferido por sideload. 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é-criados, 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

Adicione o arquivo de permissões de pré-concessão de maneira semelhante a etc/default-permissions/.

Configurar sobreposições

O serviço de dashcam tem configurações sobrepostas.

Configuração de serviço

dashcam-service/res/values/config.xml

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

  • config_file O nome do arquivo de configuração do acionador em /assets
  • allow_internal_storage Permitir que as gravações sejam salvas no armazenamento interno
  • boot_startup_enabled Início do serviço de câmera veicular na inicialização do dispositivo
  • notifications_on Mostrar notificações quando a gravação começar
  • default_app_component O app de dashcam padrão, que tem acesso global a gravações e acionadores
  • recording_module ComponentName da implementação IRecordingModule
  • streaming_module ComponentName da implementação IStreamingModule
  • trigger_module ComponentName da implementação ITriggerModule

Configuração do gatilho

Para configurar os acionadores de gravação, crie uma cópia de:

dashcam-service/src/assets/config.xml

e adicione isso ao diretório de recursos. Aponte para esse arquivo no elemento config_file do arquivo de configuração do serviço.

A configuração do gatilho consiste em partes de armazenamento, câmera e gatilho:

Armazenamento

A configuração de armazenamento tem os seguintes elementos:

  • maxStorageUsagePercent Porcentagem máxima do armazenamento disponível que a dashcam usa antes de excluir gravações.

  • maxStorageUsageMegabytes Quantidade máxima de armazenamento em megabytes que a dashcam usa antes de excluir gravações.

  • maxAgeHoursBeforePrune Número máximo de horas antes de uma gravação ser cortada. Uma gravação pode ser cortada antes se os limites de armazenamento forem atingidos.

Câmera

A configuração da câmera tem os seguintes elementos:

  • ID da câmera. ID da câmera com o prefixo "camera".

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

  • width Largura opcional do buffer retornado pela câmera.

  • height Altura opcional do buffer retornado pela câmera.

<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>

Este exemplo mostra o ID da câmera EVS:1 com um pré-vídeo de 10 segundos em 1080p e o ID da câmera Camera2:1 com um pré-vídeo de 10 segundos e largura e altura padrão.

Acionador

A configuração do gatilho consiste em uma lista de gatilhos definidos pelo seguinte:

  • name O nome exclusivo do acionador.

  • cameras IDs das câmeras.

  • sensorPropertyID ID do sensor com o prefixo do grupo de sensores. As opções de prefixo são VHAL ou SENSOR_MANAGER.

  • description Descrição do gatilho que é exibida na interface.

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

  • 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 em relação ao thresholdValue. As opções são AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK e PEAK_HOLD.

  • thresholdValue O valor comparado com o valor do sensor.

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

  • triggerCooldown Período de espera em milissegundos antes de acionar outro evento desse tipo.

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

Este exemplo mostra um gatilho em que TriggerModule monitora um sensor VHAL que produz valores inteiros. TriggerModule compara a igualdade com o valor limite. Quando a condição de igualdade é atendida, um gatilho grava nas câmeras EVS 1 e 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"/>

Este exemplo mostra um gatilho em que TriggerModule monitora um sensor VHAL que produz valores de ponto flutuante. TriggerModule compara a média do sensor em um intervalo de 10 amostras com o valor de limite de 20.0. O intervalo de amostra é definido em thresholdExtra. Um novo evento só pode ser acionado a cada 2000 milissegundos, conforme definido em triggerCooldown.

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.

  • O gatilho contém a lógica para acionar uma gravação com base nos dados do sensor. As APIs de 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 dashcam usa dashcam-service/res/values/config.xml para determinar onde encontrar as implementações de módulo. Implementações padrão são fornecidas para cada módulo. No entanto, cada módulo pode ser sobreposto definindo o componente no valor de configuração correspondente.

Defina o nome do componente de implementação do OEM de:

  • IRecorderModule a recording_module
  • IStreamModule a streaming_module
  • ITriggerModule a trigger_module

No tempo de execução, o serviço de câmera de painel cria uma instância do nome do componente definido em config.xml para cada módulo.

Guia para desenvolvedores de apps

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

OverlayUI

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

Estender acionadores

Os gatilhos podem ser estendidos para a sessão atual com uma chamada para DashcamManager#addTrigger(). Os gatilhos adicionados persistem apenas na sessão atual.

Início automático

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

Práticas recomendadas

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

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

  • Otimização de desempenho. Otimize a performance 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 a Camera2 precisam ser compatíveis e estar disponíveis no AAOS IVI.

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