L'application Caméra embarquée est conçue pour s'intégrer à AAOS. Elle offre aux conducteurs des fonctionnalités d'enregistrement vidéo pour améliorer leur sécurité. Ce guide décrit les exigences techniques, les étapes d'intégration et les bonnes pratiques à suivre pour assurer une implémentation réussie.
Prérequis
Avant de continuer, vérifiez que les conditions préalables suivantes sont remplies:
SDK:
- Le SDK 31 ou version ultérieure est requis.
Matériel :
- Caméras EVS ou Camera2 disponibles pour AAOS.
- Un espace de stockage interne suffisant ou la prise en charge d'un stockage externe amovible
doit être disponible pour les enregistrements vidéo.
Configuration logicielle requise:
- Assistance non groupée. Pour en savoir plus, consultez la section Applications non groupées.
- Autorisations. La dashcam nécessite des autorisations système.
Obtenir le code source
La caméra embarquée fait partie des applications non groupées AAOS. Pour consulter le code non groupé, consultez Vérifier le code.
Parcourez le code source avec la recherche de code Android.
Le code source est fourni dans ces trois modules:
- Service Dashcam Logiciels de streaming, d'enregistrement et de déclenchement.
- Dashcam Manager Se connecte au service Dashcam et expose une API stable aux clients
- Application Dashcam : application Dashcam de référence utilisant l'API Dashcam Manager
Créer Dashcam
Utilisez Soong ou Gradle pour compiler Dashcam.
Soong
Sur Soong:
mma DashcamService DashcamManager-lib DashcamApp
Les APK se trouvent dans out/target/product/[lunch-target]/system/priv-app/
Gradle
Dans Gradle:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
Les APK se trouvent dans out/aaos-apps-gradle-build/
Des instructions détaillées sur la compilation de Dashcam avec Gradle sont fournies dans le fichier README
.
Autorisations
Plusieurs autorisations système sont requises pour le service Dashcam et l'application Dashcam.
Le moyen le plus simple d'accorder ces autorisations consiste à les inclure dans une configuration prédéfinie à l'aide de Blueprint ou de Make.
Dans 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,
}
Dans 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 \
Créez un fichier d'autorisations nommé 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>
Ajoutez les autorisations du fichier manifeste au fichier d'autorisations.
Avant d'utiliser Dashcam, accordez à l'avance les autorisations Camera2 au service Dashcam, comme indiqué dans Caméra AAOS.
Ajoutez le fichier d'autorisations préaccordées au fichier de modèle ou de compilation de la même manière que le fichier d'autorisations.
Dans 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>
Dans 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,
}
Pour en savoir plus, consultez Intégrer un prébuild dans une image système et Ajouter une liste d'autorisations.
Téléchargement indépendant
Le fichier d'autorisations peut également être installé en mode hors connexion. Utilisez cette méthode lorsque la caméra embarquée prédéfinie n'est pas configurée.
À l'aide du fichier d'autorisations créé précédemment dans la section "Précompilés", exécutez la commande suivante:
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
Ajoutez le fichier d'autorisations pré-autorisation de la même manière que etc/default-permissions/
.
Configurer des superpositions
Le service Dashcam dispose de configurations superposables.
Configuration de service
dashcam-service/res/values/config.xml
Ce fichier contient les configurations du service:
config_file
Nom du fichier de configuration du déclencheur dans/assets
allow_internal_storage
Autoriser l'enregistrement dans la mémoire de stockage interneboot_startup_enabled
Démarrage du service Dashcam au démarrage de l'appareilnotifications_on
Afficher les notifications lorsque l'enregistrement commencedefault_app_component
L'application de caméra embarquée par défaut, qui dispose d'un accès aux enregistrements et aux déclencheurs globauxrecording_module
ComponentName de l'implémentationIRecordingModule
streaming_module
ComponentName de l'implémentationIStreamingModule
trigger_module
ComponentName de l'implémentationITriggerModule
Configuration du déclencheur
Pour configurer les déclencheurs d'enregistrement, créez une copie des éléments suivants:
dashcam-service/src/assets/config.xml
et ajoutez-le au répertoire des composants. Pointez vers ce fichier dans l'élément config_file
du fichier de configuration du service.
La configuration du déclencheur se compose de trois parties : stockage, caméra et déclencheur :
Stockage
La configuration de stockage comporte les éléments suivants:
maxStorageUsagePercent
Pourcentage maximal d'espace de stockage disponible utilisé par la caméra avant que les enregistrements ne soient supprimés.maxStorageUsageMegabytes
Quantité maximale de stockage en mégaoctets utilisée par la caméra avant que les enregistrements ne soient supprimés.maxAgeHoursBeforePrune
Nombre maximal d'heures avant qu'un enregistrement ne soit supprimé. Un enregistrement peut être supprimé plus tôt si les limites de stockage sont atteintes.
Appareil photo
La configuration de la caméra comprend les éléments suivants:
ID de l'appareil photo : ID de la caméra avec le préfixe de la caméra.
prerollLengthMs
Durée du pré-roll à stocker avec chaque événement.width
Largeur facultative du tampon renvoyé par la caméra.height
Hauteur facultative du tampon renvoyé par la caméra.
<CameraConfig>
<Camera
ID="EVS:1"
prerollLengthMs="10000"
width="1920"
height="1080" />
<Camera
ID="Camera2:1"
prerollLengthMs="10000" />
</CameraConfig>
Cet exemple montre l'ID de caméra EVS:1 avec un préroll de 10 secondes en 1080p et l'ID de caméra Camera2:1 avec un préroll de 10 secondes et une largeur et une hauteur par défaut.
Déclencheur
La configuration du déclencheur consiste en une liste de déclencheurs définis par les éléments suivants:
name
Nom unique du déclencheur.cameras
ID des caméras.ID
sensorPropertyID
du capteur avec le groupe de capteurs en préfixe. Les options de préfixe sontVHAL
ouSENSOR_MANAGER
.description
Description du déclencheur affichée dans l'UI.recordingLengthMs
Durée d'enregistrement après l'événement, en millisecondes.sensorValueType
Type de données produites par le capteur. Les options sontINT
,INT_ARRAY
,FLOAT
,FLOAT_ARRAY
etBOOLEAN, STRING
.thresholdType
Comment évaluer la valeur du capteur par rapport àthresholdValue
. Les options sontAVERAGE
,BOOLEAN
,EQUALS
,LEAP
,LEAP_AVERAGE
,LEAP_OVER
,PEAK
etPEAK_HOLD
.thresholdValue
Valeur comparée à la valeur du capteur.thresholdExtra
Valeur supplémentaire requise pour certains types de seuils, tels que la plage pourAVERAGE
.triggerCooldown
Temps de pause en millisecondes avant de déclencher un autre événement de ce type.
<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>
Cet exemple montre un déclencheur dans lequel TriggerModule
surveille un capteur VHAL produisant des valeurs entières.
TriggerModule
compare l'égalité à la valeur du seuil. Lorsque la condition d'égalité est remplie, un déclencheur enregistre sur les caméras EVS 1 et 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"/>
Cet exemple montre un déclencheur dans lequel TriggerModule
surveille un capteur VHAL produisant des valeurs flottantes.
TriggerModule
compare la moyenne du capteur sur une plage d'échantillons 10
à la valeur seuil de 20.0
.
La plage d'échantillonnage est définie dans thresholdExtra
. Un nouvel événement ne peut être déclenché que toutes les 2000
millisecondes, comme défini dans triggerCooldown
.
Modules
Le service Dashcam se compose de trois modules:
Stream contient la logique de gestion des flux des caméras.
Enregistrement contient la logique de gestion des enregistrements.
Déclencheur contient la logique de déclenchement d'un enregistrement à partir des données des capteurs. Les API du module sont définies dans leurs interfaces correspondantes,
IStreamModule
,IRecorderModule
etITriggerModule
, et exposées àDashcamManager
viaDashcamServiceAPI
.
Modules de superposition
Le service Dashcam utilise dashcam-service/res/values/config.xml
pour déterminer l'emplacement des implémentations de module. Des implémentations par défaut sont fournies pour chaque module. Toutefois, chaque module peut être superposé en définissant son composant dans la valeur de configuration correspondante.
Définissez le nom du composant d'implémentation OEM de:
- De
IRecorderModule
àrecording_module
- De
IStreamModule
àstreaming_module
- De
ITriggerModule
àtrigger_module
Au moment de l'exécution, le service Dashcam instancie le nom du composant défini dans config.xml
pour chaque module.
Guide du développeur d'applications
Dashcam est une solution de caméra embarquée et personnalisable prête pour la production. La dashcam utilise les API Dashcam Manager pour communiquer avec Dashcam service
. L'API Dashcam Manager est disponible sur IDashcamManager
. Toute application disposant des autorisations requises peut utiliser Dashcam Manager.
OverlayUI
L'application peut être personnalisée avec des superpositions de ressources d'exécution. Pour en savoir plus, consultez la section Superpositions de ressources d'exécution. Pour consulter la liste des éléments superposables, consultez overlayable.xml.
Déclencheurs étendus
Les déclencheurs peuvent être étendus pour la session en cours avec un appel à DashcamManager#addTrigger()
. Les déclencheurs ajoutés ne persistent que pour la session en cours.
Démarrage automatique
L'enregistrement automatique n'est pas disponible. Toutefois, un déclencheur manuel peut être démarré onBoot
avec un appel à DashcamManager.startRecording()
.
Bonnes pratiques
Stockage. Nous vous recommandons vivement d'utiliser un stockage externe amovible.
Expérience utilisateur Concevez l'interface utilisateur de l'application Dashcam pour qu'elle soit intuitive et conviviale, en respectant les consignes de conception d'AAOS.
Optimisation des performances Optimisez les performances de l'application pour réduire l'utilisation des ressources et assurer un fonctionnement fluide dans AAOS.
Dépannage
Problèmes de connectivité de la caméra EVS ou Camera2 doivent être compatibles et disponibles dans l'IVI AAOS.
Erreurs de stockage. Vérifier l'espace de stockage disponible et gérer les enregistrements Nous vous recommandons vivement d'utiliser un espace de stockage externe, car l'utilisation de l'espace de stockage interne peut entraîner une usure prématurée de l'espace de stockage.