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
A câmera para carro faz parte dos apps desempacotados do AAOS. Para conferir o código não agrupado, consulte Confira 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. 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.
 
 
Criar a câmera veicular
Use o Soong ou o Gradle para criar a 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/
As instruções detalhadas para criar a Dashcam com o Gradle estão 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 predefinida 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"],
}
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,
}
Em "Fazer":
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 com o nome 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 permissões do manifesto ao arquivo de permissões.
Antes de usar a câmera veicular, conceda as permissões da Camera2 ao serviço, conforme mostrado em Câmera AAOS.
Adicione o arquivo de permissões pré-concedidas ao arquivo do Make ou do Blueprint da mesma maneira 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 em uma imagem do sistema e Adicionar uma lista de permissões.
Sideload
O arquivo de permissões também pode ser transferido. Use esse método quando a câmera 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
Adicione o arquivo de permissões de pré-permissão de maneira semelhante a etc/default-permissions/.
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:
- config_fileO nome do arquivo de configuração do acionador em- /assets
- allow_internal_storagePermitir que as gravações sejam salvas no armazenamento interno
- boot_startup_enabledO serviço da câmera veicular é iniciado na inicialização do dispositivo
- notifications_onMostrar notificações quando a gravação for iniciada
- default_app_componentO app padrão da câmera veicular, que tem acesso a gravações globais e a acionamentos globais
- recording_moduleComponentName da implementação de- IRecordingModule
- streaming_moduleComponentName da implementação de- IStreamingModule
- trigger_moduleComponentName da implementação de- ITriggerModule
Configuração do acionador
Para configurar os gatilhos 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
no 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:
- maxStorageUsagePercentPorcentagem máxima de armazenamento disponível que a câmera usa antes de excluir gravações.
- maxStorageUsageMegabytesQuantidade máxima de armazenamento em megabytes que a câmera usa antes de podar gravações.
- maxAgeHoursBeforePruneNúmero máximo de horas antes que uma gravação seja removida. Uma gravação pode ser removida mais cedo se os limites de armazenamento forem atendidos.
Câmera
A configuração da câmera tem os seguintes elementos:
- ID da câmera. ID da câmera com o prefixo da câmera. 
- prerollLengthMsDuração do pré-rol armazenado com cada evento.
- widthLargura opcional do buffer retornado pela câmera.
- heightAltura 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é-rol de 10 segundos em 1080p e o ID da câmera Camera2:1 com um pré-rol de 10 segundos e largura e altura padrão.
Acionador
A configuração do acionador consiste em uma lista de acionadores definidos por:
- nameO nome exclusivo do acionador.
- camerasIDs das câmeras.
- sensorPropertyIDID do sensor com o prefixo do grupo de sensores. As opções de prefixo são- VHALou- SENSOR_MANAGER.
- descriptionDescrição do gatilho exibido na interface.
- recordingLengthMsDuração após o evento a ser gravada em milissegundos.
- sensorValueTypeTipo de dados produzidos pelo sensor. As opções são- INT,- INT_ARRAY,- FLOAT,- FLOAT_ARRAYe- BOOLEAN, STRING.
- thresholdTypeComo avaliar o valor do sensor em relação ao- thresholdValue. As opções são- AVERAGE,- BOOLEAN,- EQUALS,- LEAP,- LEAP_AVERAGE,- LEAP_OVER,- PEAKe- PEAK_HOLD.
- thresholdValueO valor comparado com o do sensor.
- thresholdExtraValor extra necessário para alguns tipos de limite, como o intervalo para- AVERAGE.
- triggerCooldownTempo 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 acionador em que TriggerModule monitora um sensor VHAL que produz valores inteiros.
TriggerModule compara a igualdade com o valor de limite. Quando a condição de igualdade é atendida, um acionador
registra 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 acionador em que TriggerModule monitora um sensor VHAL que produz valores flutuantes.
TriggerModule compara a média do sensor em um intervalo de amostras de 10 com o valor de limite de 20.0.
O intervalo de amostragem é 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. 
- 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,- IRecorderModulee- ITriggerModule, e expostas ao- DashcamManagerpor- 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. As 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 OEM de:
- IRecorderModulea- recording_module
- IStreamModulea- streaming_module
- ITriggerModulea- trigger_module
No tempo de 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é.
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. É altamente recomendável usar um armazenamento removível externo. 
- 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 precisa ter suporte e estar disponível 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. 
