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, consulteSensorPrivacyPolicy
emCameraService.h
. - Registre-se com o
SensorPrivacyManager
e receba o estado do bloco na inicialização. Para mais detalhes, consulteSensorPrivacyPolicy::registerSelf
emCameraService.cpp
. - Processe as mudanças de estado Sensores desativados no callback. Para mais
detalhes, consulte
SensorPrivacyPolicy::onSensorPrivacyChanged
eCameraService::blockAllClients
emCameraService.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::validateClientPermissionsLocked
emCameraService.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.