O app Dashcam foi projetado para se integrar ao AAOS, oferecendo aos motoristas recursos de gravação de vídeo para maior 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 prévias foram atendidas:
SDK:
- O SDK 31 ou mais recente é obrigatório.
Hardware:
- Câmeras EVS ou Camera2 disponíveis para o AAOS.
- Espaço de armazenamento interno suficiente ou suporte para armazenamento externo removível
precisa estar disponível para gravações de vídeo.
Requisitos de software:
- Suporte não agrupado. Para saber mais, consulte Apps não agrupados.
- Permissões. A câmera veicular exige permissões do sistema.
Conseguir o código-fonte
A câmera veicular faz parte dos apps não agrupados 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 câmera veicular e expõe uma API estável aos clientes.
- App de câmera veicular : aplicativo de câmera veicular de referência usando a API do gerenciador de câmera veicular.
Criar câmera veicular
Use o Soong ou o Gradle para criar a câmera veicular.
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 a câmera veicular com o Gradle são fornecidas 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 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,
}
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 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 do Blueprint ou do Make 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 uma pré-criação a uma imagem do sistema e Adicionar uma lista de permissões.
Sideload
O arquivo de permissões também pode ser sideload. Use esse método quando a câmera veicular pré-criada não estiver configurada.
Usando o arquivo de permissões criado na seção de pré-criações anteriormente, 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 pré-concedidas de maneira semelhante a etc/default-permissions/.
Configurar sobreposições
O serviço de câmera veicular tem configurações sobreponíveis.
Configurações de serviço
dashcam-service/res/values/config.xml
Este arquivo contém configurações para o serviço:
config_fileO nome do arquivo de configuração do acionador em/assetsallow_internal_storagePermitir que as gravações sejam salvas no armazenamento internoboot_startup_enabledIniciar o serviço de câmera veicular na inicialização do dispositivonotifications_onMostrar notificações quando a gravação começardefault_app_componentO app de câmera veicular padrão, que tem acesso global a gravações e acionadoresrecording_moduleComponentName da implementaçãoIRecordingModulestreaming_moduleComponentName da implementaçãoIStreamingModuletrigger_moduleComponentName da implementaçãoITriggerModule
Configuração do acionador
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 assets. Aponte para esse arquivo no elemento config_file no arquivo de configurações de serviço.
A configuração do acionador consiste em partes de armazenamento, câmera e acionador:
Armazenamento
A configuração de armazenamento tem os seguintes elementos:
maxStorageUsagePercentPorcentagem máxima de armazenamento disponível que a câmera veicular usa antes de remover gravações.maxStorageUsageMegabytesQuantidade máxima de armazenamento em megabytes que a câmera veicular usa antes de remover gravações.maxAgeHoursBeforePruneNúmero máximo de horas antes que uma gravação seja removida. Uma gravação pode ser removida 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 da câmera.
prerollLengthMsDuração do pré-roll a ser 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é-roll de 10 segundos em 1080p e o ID da câmera Camera2:1 com um pré-roll de 10 segundos e largura e altura padrão.
Gatilho
A configuração do acionador consiste em uma lista de acionadores definidos pelo seguinte:
nameO nome exclusivo do acionador.camerasIDs das câmeras.sensorPropertyIDID do sensor prefixado com o grupo de sensores. As opções de prefixo sãoVHALouSENSOR_MANAGER.descriptionDescrição do acionador que é exibida na interface.recordingLengthMsDuração após o evento a ser gravado em milissegundos.sensorValueTypeTipo de dados produzidos pelo sensor. As opções sãoINT,INT_ARRAY,FLOAT,FLOAT_ARRAYeBOOLEAN, STRING.thresholdTypeComo avaliar o valor do sensor em relação aothresholdValue. As opções sãoAVERAGE,BOOLEAN,EQUALS,LEAP,LEAP_AVERAGE,LEAP_OVER,PEAKePEAK_HOLD.thresholdValueO valor comparado ao valor do sensor.thresholdExtraValor extra necessário para alguns tipos de limite, como o intervalo paraAVERAGE.triggerCooldownTempo de espera em milissegundos antes de disparar 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 limite. Quando a condição de igualdade é atendida, um acionador 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 acionador em que TriggerModule monitora um sensor VHAL que produz valores flutuantes.
TriggerModule compara a média do sensor em um intervalo de 10 amostras com o valor 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 veicular consiste em três módulos:
Stream contém a lógica para processar streams de câmeras.
Gravação contém a lógica para processar gravações.
Acionador contém a lógica para acionar uma gravação de dados do sensor. As APIs do módulo são definidas nas interfaces correspondentes,
IStreamModule,IRecorderModuleeITriggerModule, e expostas aoDashcamManagerpeloDashcamServiceAPI.
Módulos de sobreposição
O serviço de câmera veicular usa dashcam-service/res/values/config.xml para determinar onde encontrar as implementações do 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:
IRecorderModulepararecording_module- De
IStreamModuleparastreaming_module ITriggerModuleparatrigger_module
No ambiente de execução, o serviço de câmera veicular instancia o nome do componente definido em config.xml para cada módulo.
Guia do desenvolvedor de apps
A câmera veicular é uma solução de câmera veicular pronta para produção e personalizável. Ela usa APIs do gerenciador de câmera veicular para se comunicar com Dashcam service. A API do gerenciador de câmera veicular pode ser encontrada em IDashcamManager. Qualquer app com as permissões necessárias pode usar o gerenciador de câmera veicular.
OverlayUI
O app pode ser personalizado com sobreposições de recursos do ambiente de execução. Para saber mais, consulte Sobreposições de recursos do ambiente de execução. Para conferir a lista de elementos sobreponíveis, consulte overlayable.xml.
Estender acionadores
Os acionadores podem ser estendidos para a sessão atual com uma chamada para DashcamManager#addTrigger(). Os acionadores adicionados persistem apenas para a sessão atual.
Início automático
A gravação de 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 externo removível é altamente recomendado.
Experiência do usuário. Projete a interface do usuário do app de câmera veicular 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 ser compatíveis 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.