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 callbackonSensorChanged. - 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.
- Implemente a interface
BnSensorPrivacyListener. Para mais detalhes, consulteSensorPrivacyPolicyemCameraService.h. - Registre-se com o
SensorPrivacyManagere receba o estado do bloco na inicialização. Para mais detalhes, consulteSensorPrivacyPolicy::registerSelfemCameraService.cpp. - Processe as mudanças de estado Sensores desativados no callback. Para mais
detalhes, consulte
SensorPrivacyPolicy::onSensorPrivacyChangedeCameraService::blockAllClientsemCameraService.cpp. - 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::validateClientPermissionsLockedemCameraService.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.