Sensores desativados

No modo avião, os dispositivos ainda podem acessar alguns sensores para ativar funcionalidades específicas, como rotação da tela e captura de fotos. O Android 10 oferece uma configuração de opções para desenvolvedores para desativar todos os sensores em um dispositivo. Esse recurso ajuda os desenvolvedores a testar a funcionalidade do app em situações em que esses sensores se tornam indisponíveis e também oferece aos usuários uma maneira de controlar os sensores nos dispositivos.

Quando um desenvolvedor ou usuário ativa a opção Sensors off nas opções do desenvolvedor (Settings > System > Developer options > Quick settings developer tiles), um novo bloco aparece na bandeja de configurações rápidas. Eles podem usar o Bloco para impedir que os apps acessem a câmera, o microfone e todos os sensores gerenciados pela classe SensorManager.

Aviso:essa opção afeta apenas os apps que acessam os sensores por meio de "SensorService", "CameraService" e "AudioPolicyService". As funções de telefonia não usam "AudioPolicyService" e ainda têm acesso ao microfone durante as ligações.

Implementação

O Android 10 inclui uma implementação de referência que processa a câmera, o microfone e os sensores SensorManager. O serviço do sistema que gerencia o estado Sensores desativados e notifica os clientes sobre mudanças de estado está localizado em frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java. O gerenciador que facilita o acesso a SensorPrivacyService no contexto de um aplicativo está localizado em frameworks/base/core/java/android/hardware/SensorPrivacyManager.java.

Caso seus dispositivos usem a implementação padrão de SensorService, CameraService e AudioPolicyService, nenhuma personalização extra é necessária para o design de referência. Se você tiver outros sensores, consulte Personalização para mais detalhes sobre a compatibilidade com esse recurso.

Problemas comuns

Ao implementar esse recurso, às vezes os apps de câmera não respondem corretamente aos callbacks onError, tanto na primeira tentativa de aquisição da câmera quanto quando ela não está mais disponível. Isso geralmente resulta na falha do app quando esse bloco é ativado, mas pode ser usado como um indicador para indicar que o recurso está funcionando como esperado.

Esse comportamento indica que o app não está processando corretamente o callback onError em CameraDevice.StateCallback. Quando Sensors off está ativado, o callback onError é invocado com CameraDevice.StateCallback.ERROR_CAMERA_DISABLED definido como o valor de erro. Atualize todos os apps próprios para processar o callback onError com esse valor, não fazendo chamadas subsequentes em CameraDevice até que uma chamada openCamera subsequente seja bem-sucedida.

Comportamento do sensor

Quando a opção Sensores desativados está ativada, os sensores param de enviar dados para o sistema ou apps. Um app ainda pode solicitar um sensor e registrar um listener quando a opção Sensores desativados estiver ativada, mas o silêncio será retornado para o microfone ou o callback onSensorChanged nunca será invocado para os sensores. Assim que o bloco é desativado, esses mesmos listeners começam a receber a saída real do microfone ou os callbacks esperados para onSensorChanged sem precisar fazer nenhum trabalho extra. O comportamento padrão dos sensores silenciados é o seguinte.

Câmera

Se um app estiver usando a câmera quando a opção Sensores desativados estiver ativada, um erro será enviado para o método de callback onError e CameraDevice será fechado.

Se um app tentar acessar a câmera quando a opção Sensors off estiver ativada, um erro será enviado para o método de callback onError.

Microfone

Quando a opção Sensors off está ativada, o acesso ao microfone ainda é possível, mas apenas o silêncio é retornado. Se um app estiver usando o microfone quando Sensores desativados estiver ativado, nenhum erro será gerado, mas a gravação será silenciada e retornará apenas uma matriz de zeros. Se a opção Sensors off estiver desativada enquanto o app ainda estiver usando o microfone, os dados de áudio esperados serão retornados.

Se um app tentar acessar o microfone quando a opção Sensores desativados estiver ativada, o microfone vai retornar silêncio.

Sensor

Quando um app tenta acessar outros sensores com a opção Sensores desativados ativada, o tipo de sensor influencia o comportamento padrão:

  • Sensores contínuos:os sensores nesse modo de relatório param de enviar eventos. Se um app estiver interagindo com um sensor contínuo quando Sensores desativados estiver ativado, o sensor não enviará dados adicionais para o app até que o recurso seja desativado.
  • Eventos de limpeza:um sensor pode ser limpo quando o bloco está ativado e o callback onFlushComplete é invocado para indicar que a limpeza solicitada foi concluída, mas nenhum evento novo com dados do sensor é gerado e retornado ao callback onSensorChanged.
  • Eventos de mudança:quando a opção Sensors off está ativada, nenhum novo evento de mudança é informado.
  • Eventos de acionamento:quando a opção Sensores desativados está ativada, os eventos de acionamento param de ser gerados. Todos os eventos atuais são concluídos.

Personalização

Caso seus dispositivos usem a implementação padrão de SensorService, CameraService e AudioPolicyService, nenhuma outra personalização é necessária para o design de referência. No entanto, é possível oferecer suporte a sensores gerenciados fora de SensorManager, remover Sensores desativados dos dispositivos ou mudar a IU do sistema para os blocos de configurações rápidas do desenvolvedor ou o ícone do bloco Sensores desativados.

Oferecer suporte a mais sensores

Se os dispositivos tiverem sensores gerenciados fora da SensorManager, adicione suporte a eles usando SensorPrivacyService e SensorPrivacyManager.

Quando o bloco Sensores desativados é alternado, SensorPrivacyService invoca um callback unidirecional para todos os listeners registrados. Quando esse callback é recebido, o listener registrado pode realizar as etapas necessárias com base no estado do bloco. Se estiver ativado, todas as conexões atuais poderão ser encerradas e retornar dados vazios, e uma flag será definida para impedir novas conexões. Se estiver desativada, a flag poderá ser redefinida para permitir novas conexões. Usando o serviço de câmera (platform/frameworks/av/services/camera/libcameraservice/) como exemplo, siga estas etapas para adicionar suporte a um novo sensor.

  1. Implemente a interface BnSensorPrivacyListener. Para mais detalhes, consulte SensorPrivacyPolicy em CameraService.h.
  2. Registre-se com o SensorPrivacyManager e receba o estado do bloco na inicialização. Para mais detalhes, consulte SensorPrivacyPolicy::registerSelf em CameraService.cpp.
  3. Processe as mudanças de estado Sensores desativados no callback. Para mais detalhes, consulte SensorPrivacyPolicy::onSensorPrivacyChanged e CameraService::blockAllClients em CameraService.cpp.
  4. Impedir o acesso aos dados do sensor quando o Bloco estiver ativado. Para mais detalhes, consulte a verificação da política de privacidade do sensor em CameraService::validateClientPermissionsLocked em CameraService.cpp.

Remover "Sensores desativados"

Como uma ferramenta de desenvolvedor para testes, Sensors off fica oculta porque o usuário precisa primeiro ativar o modo de desenvolvedor e depois escolher disponibilizar o bloco nas configurações.

Se você não quiser oferecer suporte a Sensores desativados nos seus dispositivos, remova a tag de serviço de packages/apps/Settings/AndroidManifest.xml. Se você remover a tag de serviço, o bloco Sensores desativados não vai estar disponível para ativação na página de blocos de configurações rápidas do desenvolvedor.

Mudar a interface "Sensores desativados"

Há dois elementos que podem ser personalizados para a interface Sensors off: o ícone exibido para o bloco de configurações rápidas do desenvolvedor e o ícone exibido na barra de status quando o bloco é ativado. Para personalizar a aparência desses ícones, substitua estes arquivos:

  • Ícone do bloco de configurações rápidas: packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
  • Ícone da barra de status: frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml

Validação

Como uma ferramenta opcional para desenvolvedores, não há testes do CTS para esse recurso.

Para testar manualmente, instale um app do Google Play que leia e mostre todos os sensores do dispositivo. Ao ativar o bloco Sensores desativados, verifique se nenhum dos valores dos sensores muda, se o áudio do microfone está em silêncio e se a câmera não está acessível.