Capteurs désactivés

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 fournit un paramètre d'options de développement pour désactiver tous les capteurs d'un appareil. Cette fonctionnalité aide les développeurs à tester les fonctionnalités de leur application dans des situations où ces capteurs deviennent indisponibles, et donne également aux utilisateurs un moyen de contrôler les capteurs de leur appareil.

Lorsqu'un développeur ou un utilisateur active les capteurs désactivés dans les options du développeur ( Paramètres > Système > Options du développeur > Vignettes du développeur des paramètres rapides ), une nouvelle vignette apparaît dans la barre des paramètres rapides. Ils peuvent utiliser la vignette pour empêcher les applications d'accéder à la caméra, au microphone et à tous les capteurs gérés par la classe SensorManager .

Avertissement : cette option affecte uniquement 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 microphone pendant les appels téléphoniques.

Mise en œuvre

Android 10 inclut une implémentation de référence qui gère les capteurs de la caméra, du microphone et SensorManager . Le service système qui gère l'état des capteurs désactivés 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 disposez d'autres capteurs, consultez Personnalisation pour plus de détails sur la prise en charge de cette fonctionnalité.

Problèmes courants

Lors de la mise en œuvre de cette fonctionnalité, il arrive parfois que les applications de caméra ne répondent pas correctement aux rappels onError , à la fois lors de la première tentative d'acquisition de la caméra et lorsque la caméra n'est plus disponible. Cela entraîne généralement le blocage de l'application lorsque cette vignette 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 Sensors off est activé, le rappel onError est invoqué avec CameraDevice.StateCallback.ERROR_CAMERA_DISABLED défini comme valeur d'erreur. Mettez à jour toutes les applications propriétaires pour gérer le rappel onError avec cette valeur en n'effectuant aucun appel ultérieur sur CameraDevice jusqu'à ce qu'un appel openCamera ultérieur réussisse.

Comportement du capteur

Lorsque Capteurs désactivés est activé, les capteurs cessent de transmettre des données au système ou aux applications. Une application peut toujours demander un capteur et enregistrer un auditeur lorsque Sensors off est activé, mais soit le silence est renvoyé pour le micro, soit le rappel onSensorChanged n'est jamais invoqué pour les capteurs. Dès que la vignette est désactivée, ces mêmes auditeurs commencent à recevoir la sortie réelle du micro ou les rappels attendus vers onSensorChanged sans avoir besoin d'effectuer de travail supplémentaire. Le comportement par défaut des capteurs silencieux est le suivant.

Caméra

Si une application utilise la caméra lorsque Sensors off est activé, une erreur est envoyée à la méthode de rappel onError et CameraDevice est fermé.

Si une application tente d'accéder à la caméra lorsque les capteurs désactivés sont activés, une erreur est envoyée à la méthode de rappel onError .

Microphone

Lorsque Capteurs désactivés est activé, l'accès au microphone est toujours possible mais seul le silence est renvoyé. Si une application utilise le microphone lorsque les capteurs désactivés sont activés, aucune erreur n'est générée, mais l'enregistrement est réduit au silence et renvoie simplement un tableau de zéros. Si Capteurs désactivés est désactivé alors que l'application utilise toujours le microphone, les données audio attendues sont renvoyées.

Si une application tente d'accéder au microphone lorsque l'option Capteurs désactivés est activée, le microphone 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 continus : les capteurs dans ce mode de rapport arrêtent de distribuer des événements. Si une application interagit avec un capteur continu lorsque l'option Capteurs désactivés est activée, le capteur n'envoie aucune donnée supplémentaire à l'application jusqu'à ce que la fonctionnalité soit désactivée.
  • Événements de vidage : un vidage de capteur peut être demandé lorsque la vignette est activée et que le rappel onFlushComplete est invoqué pour indiquer que le vidage demandé s'est terminé avec succès, mais aucun nouvel événement avec des données de capteur n'est généré et renvoyé au rappel onSensorChanged .
  • Événements de changement : lorsque l'option Capteurs désactivés est activée, aucun nouvel événement de changement n'est signalé.
  • Événements déclencheurs : lorsque l'option Capteurs désactivés est activée, les événements déclencheurs cessent de se générer. 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. Cependant, vous pouvez prendre en charge les capteurs gérés en dehors de SensorManager , supprimer les capteurs de vos appareils ou modifier l'interface utilisateur système pour les vignettes de paramètres rapides du développeur ou l'icône de la vignette Capteurs désactivés .

Prend en charge plus de capteurs

Si vos appareils contiennent des capteurs gérés en dehors de SensorManager , vous devez ajouter leur prise en charge à l'aide de SensorPrivacyService et SensorPrivacyManager .

Lorsque la vignette Capteurs désactivés est basculée, SensorPrivacyService appelle un rappel unidirectionnel pour tous les écouteurs enregistrés. Lorsque ce rappel est reçu, l'auditeur enregistré peut prendre les mesures nécessaires en fonction de l'état de la vignette. S'il est activé, toutes les connexions existantes peuvent être interrompues et renvoyer des données vides, ainsi qu'un indicateur défini pour empêcher de nouvelles connexions. S'il est désactivé, l'indicateur peut être réinitialisé pour autoriser de nouvelles connexions. En utilisant le service de caméra ( platform/frameworks/av/services/camera/libcameraservice/ ) comme exemple, suivez ces étapes pour ajouter la prise en charge d'un nouveau capteur.

  1. Implémentez l'interface BnSensorPrivacyListener . Pour plus de détails, consultez SensorPrivacyPolicy dans CameraService.h .
  2. Inscrivez-vous auprès du SensorPrivacyManager et obtenez l’état de la vignette au démarrage. Pour plus de détails, consultez SensorPrivacyPolicy::registerSelf dans CameraService.cpp .
  3. Gérez les changements d’état des capteurs désactivés dans le rappel. Pour plus de détails, consultez SensorPrivacyPolicy::onSensorPrivacyChanged et CameraService::blockAllClients dans CameraService.cpp .
  4. Empêchez l’accès aux données du capteur lorsque la vignette est activée. Pour plus de détails, consultez la vérification de la politique de confidentialité du capteur dans CameraService::validateClientPermissionsLocked dans CameraService.cpp .

Supprimer les capteurs

En tant qu'outil de développement destiné aux tests, Sensors off est masqué car un utilisateur doit d'abord activer le mode développeur, puis choisir de rendre la vignette disponible dans les paramètres.

Si vous ne souhaitez pas désactiver les capteurs sur vos appareils, supprimez le numéro de service de packages/apps/Settings/AndroidManifest.xml . Si vous supprimez le numéro de service, la vignette Capteurs désactivés ne pourra pas être activée à partir de la page des vignettes des paramètres rapides du développeur.

Changer les capteurs hors de l'interface utilisateur

Deux éléments peuvent être personnalisés pour l'interface utilisateur des capteurs désactivés : l'icône affichée pour la vignette des paramètres rapides du développeur et l'icône affichée dans la barre d'état lorsque la vignette est activée. Pour personnaliser l'apparence de ces icônes, remplacez ces fichiers :

  • Icône de vignette de paramètres 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

En tant qu'outil de développement facultatif, il n'existe aucun test CTS pour cette fonctionnalité.

Vous pouvez tester manuellement en installant une application de Google Play qui lit et affiche tous les capteurs de l'appareil. Lorsque vous activez la vignette Capteurs désactivés , assurez-vous qu'aucune des valeurs des capteurs ne change, que le son du microphone est silencieux et que la caméra n'est pas accessible.