O app de 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 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. 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_file
O nome do arquivo de configuração do acionador em/assets
allow_internal_storage
Permitir que as gravações sejam salvas no armazenamento internoboot_startup_enabled
O serviço da câmera veicular é iniciado na inicialização do dispositivonotifications_on
Mostrar notificações quando a gravação for iniciadadefault_app_component
O app padrão da câmera veicular, que tem acesso a gravações globais e a acionamentos globaisrecording_module
ComponentName da implementação deIRecordingModule
streaming_module
ComponentName da implementação deIStreamingModule
trigger_module
ComponentName da implementação deITriggerModule
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:
maxStorageUsagePercent
Porcentagem máxima de armazenamento disponível que a câmera usa antes de excluir gravações.maxStorageUsageMegabytes
Quantidade máxima de armazenamento em megabytes que a câmera usa antes de podar gravações.maxAgeHoursBeforePrune
Número máximo de horas antes que uma gravação seja excluída. 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.
prerollLengthMs
Duração do pré-rol 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é-rolagem de 10 segundos em 1080p e o ID da câmera Camera2:1 com um pré-rolagem de 10 segundos e largura e altura padrão.
Acionador
A configuração do acionador consiste em uma lista de acionadores definidos por:
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ãoVHAL
ouSENSOR_MANAGER
.description
Descrição do gatilho que aparece na interface.recordingLengthMs
Duração após o evento a ser gravada em milissegundos.sensorValueType
Tipo de dados produzidos pelo sensor. As opções sãoINT
,INT_ARRAY
,FLOAT
,FLOAT_ARRAY
eBOOLEAN, STRING
.thresholdType
Como avaliar o valor do sensor em relação aothresholdValue
. As opções sãoAVERAGE
,BOOLEAN
,EQUALS
,LEAP
,LEAP_AVERAGE
,LEAP_OVER
,PEAK
ePEAK_HOLD
.thresholdValue
O valor comparado com o do sensor.thresholdExtra
Valor extra necessário para alguns tipos de limite, como o intervalo paraAVERAGE
.triggerCooldown
Tempo 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
,IRecorderModule
eITriggerModule
, e expostas aoDashcamManager
porDashcamServiceAPI
.
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:
IRecorderModule
arecording_module
IStreamModule
astreaming_module
ITriggerModule
atrigger_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é.
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 da 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 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.