En mode avion, les appareils peuvent toujours accéder à certains capteurs pour activer des fonctionnalités spécifiques, telles que la rotation de l'écran et la prise de photos. Android 10 propose un paramètre d'options pour les développeurs permettant de désactiver tous les capteurs d'un appareil. Cette fonctionnalité aide les développeurs à tester les fonctionnalités de leur application dans les situations où ces capteurs ne sont plus disponibles, et permet également aux utilisateurs de contrôler les capteurs de leur appareil.
Lorsqu'un développeur ou un utilisateur active Désactivation des capteurs dans les options pour les développeurs (Paramètres > Système > Options pour les développeurs > Blocs Réglages rapides pour les développeurs), un nouveau bloc s'affiche dans la barre des réglages rapides. Ils peuvent utiliser la carte pour empêcher les applications d'accéder à l'appareil photo, au micro et à tous les capteurs gérés par la classe SensorManager
.
Avertissement:Cette option ne concerne que les applications qui accèdent aux capteurs via "SensorService", "CameraService" et "AudioPolicyService". Les fonctions de téléphonie n'utilisent pas "AudioPolicyService" et ont toujours accès au micro lors des appels téléphoniques.
Implémentation
Android 10 inclut une implémentation de référence qui gère la caméra, le micro et les capteurs SensorManager
. Le service système qui gère l'état Désactivé des capteurs et informe les clients des changements d'état se trouve dans frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
.
Le gestionnaire qui facilite l'accès à SensorPrivacyService
dans le contexte d'une application se trouve dans frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Si vos appareils utilisent l'implémentation par défaut de SensorService
, CameraService
et AudioPolicyService
, aucune personnalisation supplémentaire n'est nécessaire pour la conception de référence. Si vous avez d'autres capteurs, consultez la section Personnalisation pour en savoir plus sur la prise en charge de cette fonctionnalité.
Problèmes courants
Lors de l'implémentation de cette fonctionnalité, il arrive que les applications d'appareil photo ne répondent pas correctement aux rappels onError
, à la fois lors de la première tentative d'acquisition de l'appareil photo et lorsque l'appareil photo n'est plus disponible. Cela entraîne généralement le plantage de l'application lorsque cette carte est activée, mais cela peut être utilisé comme signal pour indiquer que la fonctionnalité se comporte comme prévu.
Ce comportement indique que l'application ne gère pas correctement le rappel onError
dans CameraDevice.StateCallback
. Lorsque l'option Désactivation des capteurs est activée, le rappel onError
est appelé avec CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
défini comme valeur d'erreur. Mettez à jour les applications propriétaires pour qu'elles gèrent le rappel onError
avec cette valeur en n'effectuant aucun appel ultérieur à CameraDevice
tant qu'un appel openCamera
ultérieur n'a pas abouti.
Comportement des capteurs
Lorsque l'option Capteurs désactivés est activée, les capteurs ne transmettent plus aucune donnée au système ni aux applications. Une application peut toujours demander un capteur et enregistrer un écouteur lorsque l'option Capteurs désactivés est activée, mais le silence est renvoyé pour le micro ou le rappel onSensorChanged
n'est jamais appelé pour les capteurs. Dès que la carte est désactivée, ces mêmes écouteurs commencent à recevoir la sortie réelle du micro ou les rappels attendus vers onSensorChanged
sans avoir à effectuer de travail supplémentaire. Le comportement par défaut des capteurs mis en sourdine est le suivant.
Appareil photo
Si une application utilise l'appareil photo lorsque l'option Désactivation des capteurs est activée, une erreur est envoyée à la méthode de rappel onError
et CameraDevice
est fermé.
Si une application tente d'accéder à l'appareil photo lorsque l'option Désactivation des capteurs est activée, une erreur est envoyée à la méthode de rappel onError
.
Micro
Lorsque l'option Désactivation des capteurs est activée, l'accès au micro reste possible, mais seul le silence est renvoyé. Si une application utilise le micro lorsque l'option Désactivation des capteurs est activée, aucune erreur n'est générée, mais l'enregistrement est désactivé et renvoie simplement un tableau de zéros. Si Désactivation des capteurs est désactivé alors que l'application utilise toujours le micro, les données audio attendues sont renvoyées.
Si une application tente d'accéder au micro lorsque l'option Désactiver les capteurs est activée, le micro renvoie le silence.
Capteur
Lorsqu'une application tente d'accéder à d'autres capteurs lorsque l'option Capteurs désactivés est activée, le type de capteur influence le comportement par défaut:
- Capteurs en continu:les capteurs de ce mode de création de rapports arrêtent de distribuer des événements. Si une application interagit avec un capteur en continu lorsque l'option Capteurs désactivés est activée, le capteur n'envoie aucune donnée supplémentaire à l'application tant que cette fonctionnalité n'est pas désactivée.
- Événements de vidage:un vidage de capteur peut être demandé lorsque la carte est activée et que le rappel
onFlushComplete
est appelé pour indiquer que le vidage demandé a bien été effectué, mais qu'aucun nouvel événement avec des données de capteur n'est généré et renvoyé au rappelonSensorChanged
. - Événements de modification:lorsque l'option Désactiver les capteurs est activée, aucun nouvel événement de modification n'est signalé.
- Événements de déclenchement:lorsque l'option Capteurs désactivés est activée, les événements de déclenchement ne sont plus générés. Tous les événements existants sont terminés.
Personnalisation
Si vos appareils utilisent l'implémentation par défaut de SensorService
, CameraService
et AudioPolicyService
, aucune personnalisation supplémentaire n'est nécessaire pour la conception de référence. Toutefois, vous pouvez prendre en charge les capteurs gérés en dehors de SensorManager
, supprimer Désactivation des capteurs de vos appareils ou modifier l'UI système pour les blocs Réglages rapides pour les développeurs ou l'icône du bloc Désactivation des capteurs.
Prendre en charge davantage de capteurs
Si vos appareils contiennent des capteurs gérés en dehors de SensorManager
, vous devez les prendre en charge à l'aide de SensorPrivacyService
et SensorPrivacyManager
.
Lorsque l'icône Désactivation des capteurs est activée, SensorPrivacyService
appelle un rappel à sens unique pour tous les écouteurs enregistrés. Lorsque ce rappel est reçu, l'écouteur enregistré peut prendre les mesures nécessaires en fonction de l'état de la carte. Si elle est activée, toutes les connexions existantes peuvent être interrompues et renvoyer des données vides, et un indicateur est défini pour empêcher de nouvelles connexions. Si elle est désactivée, l'indicateur peut être réinitialisé pour autoriser de nouvelles connexions. À l'aide du service de caméra (platform/frameworks/av/services/camera/libcameraservice/
) comme exemple, procédez comme suit pour prendre en charge un nouveau capteur.
- Implémentez l'interface
BnSensorPrivacyListener
. Pour en savoir plus, consultezSensorPrivacyPolicy
dansCameraService.h
. - Enregistrez-vous auprès de
SensorPrivacyManager
et obtenez l'état de la carte au démarrage. Pour en savoir plus, consultezSensorPrivacyPolicy::registerSelf
dansCameraService.cpp
. - Gérez les modifications d'état Capteurs désactivés dans le rappel. Pour en savoir plus, consultez
SensorPrivacyPolicy::onSensorPrivacyChanged
etCameraService::blockAllClients
dansCameraService.cpp
. - Empêcher l'accès aux données des capteurs lorsque la carte est activée Pour en savoir plus, consultez la vérification des règles de confidentialité des capteurs dans
CameraService::validateClientPermissionsLocked
dansCameraService.cpp
.
Supprimer "Capteurs désactivés"
En tant qu'outil de développement pour les tests, Désactivation des capteurs est masqué, car un utilisateur doit d'abord activer le mode développeur, puis choisir de rendre la carte disponible dans les paramètres.
Si vous ne souhaitez pas prendre en charge Désactivation des capteurs sur vos appareils, supprimez la balise de service de packages/apps/Settings/AndroidManifest.xml
. Si vous supprimez la balise de service, vous ne pourrez pas activer le bloc Désactivation des capteurs depuis la page des blocs Réglages rapides pour les développeurs.
Modifier l'UI "Capteurs désactivés"
Deux éléments peuvent être personnalisés pour l'UI Désactivation des capteurs: l'icône affichée pour le bloc de paramètres rapides du développeur et l'icône affichée dans la barre d'état lorsque le bloc est activé. Pour personnaliser l'apparence de ces icônes, remplacez les fichiers suivants:
- Icône du bloc Réglages rapides :
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Icône de la barre d'état :
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Validation
Il s'agit d'un outil facultatif pour les développeurs. Aucun test CTS n'est donc effectué pour cette fonctionnalité.
Vous pouvez effectuer un test manuel en installant une application depuis Google Play qui lit et affiche tous les capteurs de l'appareil. Lorsque vous activez la carte Désactivation des capteurs, assurez-vous qu'aucune des valeurs des capteurs ne change, que le son du micro est coupé et que la caméra n'est pas accessible.