L'application Caméra embarquée est conçue pour s'intégrer à AAOS, offrant aux conducteurs des fonctionnalités d'enregistrement vidéo pour une sécurité renforcée. 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, assurez-vous que les conditions préalables suivantes sont remplies :
SDK :
- SDK 31 ou version ultérieure requis.
Matériel :
- Caméras EVS ou Camera2 disponibles pour AAOS.
- Un espace de stockage interne suffisant ou une prise en charge du stockage externe amovible
doivent être disponibles pour les enregistrements vidéo.
Configuration logicielle requise :
- Assistance non groupée : Pour en savoir plus, consultez Applications non groupées.
- Autorisations. Dashcam nécessite des autorisations système.
Obtenir le code source
La dashcam fait partie des applications AAOS dissociées. Pour consulter le code non groupé, consultez Consulter le code.
Parcourez le code source avec Android Code Search.
Le code source est fourni dans ces trois modules :
- Service Dashcam. Logique de streaming, d'enregistrement et de déclenchement.
- Gestionnaire de caméras embarquées. Se connecte au service de caméras embarquées et expose une API stable aux clients
- Application Dashcam : application Dashcam de référence utilisant l'API Dashcam Manager
Créer une 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 pour compiler 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 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 les autorisations Camera2 au service Dashcam, comme indiqué dans Caméra AAOS.
Ajoutez le fichier d'autorisations préaccordées au fichier Blueprint ou Make 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 une précompilation dans une image système et Ajouter une liste d'autorisation.
Téléchargement indépendant
Le fichier d'autorisations peut également être installé manuellement. Utilisez cette méthode lorsque la Dashcam prédéfinie n'est pas configurée.
À l'aide du fichier d'autorisations créé précédemment dans la section sur les composants 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éaccordées de la même manière que etc/default-permissions/.
Configurer les superpositions
Le service de caméras embarquées dispose de configurations superposables.
Configuration du 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/assetsallow_internal_storageAutoriser l'enregistrement dans la mémoire de stockage interneboot_startup_enabledDémarrage du service Dashcam au démarrage de l'appareilnotifications_onAfficher une notification au début de l'enregistrementdefault_app_componentL'application de caméras embarquées par défaut, qui dispose d'un accès mondial aux enregistrements et aux déclencheursrecording_moduleComponentName de l'implémentationIRecordingModulestreaming_moduleComponentName de l'implémentationIStreamingModuletrigger_moduleComponentName de l'implémentationITriggerModule
Configuration du déclencheur
Pour configurer les déclencheurs d'enregistrement, créez une copie de :
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 des parties suivantes : stockage, caméra et déclencheur :
Stockage
La configuration du stockage comporte les éléments suivants :
maxStorageUsagePercentPourcentage maximal de l'espace de stockage disponible que la caméra embarquée utilise avant de supprimer des enregistrements.maxStorageUsageMegabytesQuantité maximale de stockage en mégaoctets utilisée par la caméra embarquée avant de supprimer des enregistrements.maxAgeHoursBeforePruneNombre maximal d'heures avant l'élagage d'un enregistrement. Un enregistrement peut être élagué plus tôt si les limites de stockage sont atteintes.
Appareil photo
La configuration de la caméra comporte les éléments suivants :
ID de la caméra : ID de la caméra avec le préfixe de la caméra.
prerollLengthMsDurée du préroll à stocker avec chaque événement.widthLargeur facultative du tampon renvoyé par la caméra.heightHauteur 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.
Trigger
La configuration du déclencheur se compose d'une liste de déclencheurs définis par les éléments suivants :
nameNom unique du déclencheur.camerasID des caméras.sensorPropertyID: ID du capteur précédé du groupe de capteurs. Les options de préfixe sontVHALouSENSOR_MANAGER.descriptionDescription du déclencheur affichée dans l'UI.recordingLengthMsDurée après l'événement à enregistrer en millisecondes.sensorValueTypeType de données produites par le capteur. Les options sontINT,INT_ARRAY,FLOAT,FLOAT_ARRAYetBOOLEAN, STRING.thresholdType: comment évaluer la valeur du capteur par rapport àthresholdValue. Les options sontAVERAGE,BOOLEAN,EQUALS,LEAP,LEAP_AVERAGE,LEAP_OVER,PEAKetPEAK_HOLD.thresholdValueValeur à comparer à la valeur du capteur.thresholdExtraValeur supplémentaire requise pour certains types de seuils, tels que la plage pourAVERAGE.triggerCooldownPériode de refroidissement en millisecondes avant le déclenchement d'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 seuil. Lorsque la condition d'égalité est remplie, un déclencheur s'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 float.
TriggerModule compare la moyenne du capteur sur une plage de 10 échantillons à la valeur seuil de 20.0.
La plage d'échantillons 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 de caméras embarquées se compose de trois modules :
Stream contient la logique de gestion des flux de caméras.
Recording contient la logique de gestion des enregistrements.
Trigger contient la logique de déclenchement d'un enregistrement à partir des données du capteur. Les API de module sont définies dans leurs interfaces correspondantes,
IStreamModule,IRecorderModuleetITriggerModule, et exposées àDashcamManagerviaDashcamServiceAPI.
Modules de superposition
Le service Dashcam utilise dashcam-service/res/values/config.xml pour déterminer où trouver les 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 sur :
- De
IRecorderModuleàrecording_module - De
IStreamModuleàstreaming_module - De
ITriggerModuleàtrigger_module
Lors 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éras embarquées prête pour la production et personnalisable. La caméra embarquée 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 le Gestionnaire de caméras embarquées.
OverlayUI
L'application peut être personnalisée avec des overlays de ressources d'exécution. Pour en savoir plus, consultez Superpositions de ressources d'exécution. Pour afficher la liste des éléments superposables, consultez overlayable.xml.
Étendre les déclencheurs
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
Le démarrage automatique de l'enregistrement n'est pas pris en charge. 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 espace de stockage externe amovible.
Expérience utilisateur : Concevez l'UI de l'application Dashcam pour qu'elle soit intuitive et conviviale, en respectant les consignes de conception AAOS.
Optimisation des performances Optimisez les performances de l'application pour minimiser 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 AAOS IVI.
Erreurs de stockage. Vérifiez l'espace de stockage disponible et gérez les enregistrements. Nous vous recommandons vivement d'utiliser un stockage externe, car l'utilisation du stockage interne peut entraîner une usure prématurée de la mémoire.