Quando no modo avião, os dispositivos ainda podem acessar alguns sensores para ativar funcionalidades específicas, como rotação de tela e tirar fotos. O Android 10 fornece uma configuração de opções do desenvolvedor para desligar todos os sensores em um dispositivo. Esse recurso ajuda os desenvolvedores a testar a funcionalidade do aplicativo em situações em que esses sensores ficam indisponíveis e também oferece aos usuários uma maneira de controlar os sensores em seus dispositivos.
Quando um desenvolvedor ou usuário desativa os Sensores nas opções do desenvolvedor ( Configurações > Sistema > Opções do desenvolvedor > Blocos do desenvolvedor de configurações rápidas ), um novo bloco aparece na bandeja de configurações rápidas. Eles podem usar o bloco para impedir que aplicativos acessem a câmera, o microfone e todos os sensores gerenciados pela classe SensorManager
.
Aviso: Esta opção afeta apenas aplicativos 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 chamadas telefônicas.
Implementação
O Android 10 inclui uma implementação de referência que lida com a câmera, o microfone e os sensores SensorManager
. O serviço do sistema que gerencia o estado Sensores desligados 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 ao SensorPrivacyService
dentro do contexto de um aplicativo está localizado em frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Se seus dispositivos usarem a implementação padrão de SensorService
, CameraService
e AudioPolicyService
, nenhuma personalização adicional será necessária para o design de referência. Se você tiver outros sensores, consulte Personalização para obter mais detalhes sobre o suporte a esse recurso.
Problemas comuns
Ao implementar esse recurso, às vezes os aplicativos de câmera não respondem adequadamente aos retornos de chamada onError
, tanto ao tentar adquirir a câmera pela primeira vez quanto quando a câmera não está mais disponível. Isso normalmente resulta na falha do aplicativo quando esse bloco está ativado, mas isso pode ser usado como um sinal para indicar que o recurso está se comportando conforme o esperado.
Esse comportamento indica que o aplicativo não está processando corretamente o retorno de chamada onError
em CameraDevice.StateCallback
. Quando Sensors off está ativado, o retorno de chamada onError
é invocado com CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
definido como o valor de erro. Atualize todos os aplicativos primários para lidar com o retorno de chamada onError
com esse valor, não fazendo nenhuma chamada subsequente no CameraDevice
até que uma chamada openCamera
subsequente seja bem-sucedida.
Comportamento do sensor
Quando Sensores desativados está ativado, os sensores param de relatar quaisquer dados ao sistema ou aos aplicativos. Um aplicativo ainda pode solicitar um sensor e registrar um ouvinte quando Sensors off está ativado, mas o silêncio é retornado para o microfone ou o retorno de chamada onSensorChanged
nunca é invocado para os sensores. Assim que o bloco é desabilitado, esses mesmos ouvintes começam a receber a saída real do microfone ou os retornos de chamada esperados para onSensorChanged
sem precisar fazer nenhum trabalho adicional. O comportamento padrão dos sensores silenciados é o seguinte.
Câmera
Se um aplicativo estiver usando a câmera quando Sensores desligados estiver ativado, um erro será enviado para o método de retorno de chamada onError
e CameraDevice
será fechado.
Se um aplicativo tentar acessar a câmera quando Sensores desativados estiver ativado, um erro será enviado ao método de retorno de chamada onError
.
Microfone
Quando Sensores desligados está ativado, o acesso ao microfone ainda é possível, mas apenas o silêncio é retornado. Se um aplicativo estiver usando o microfone quando Sensores desligados estiver ativado, nenhum erro será gerado, mas a gravação será silenciada e retornará apenas uma matriz de zeros. Se Sensores desativados estiver desativado enquanto o aplicativo ainda estiver usando o microfone, os dados de áudio esperados serão retornados.
Se um aplicativo tentar acessar o microfone quando Sensores desligados estiver ativado, o microfone retornará ao silêncio.
Sensor
Quando um aplicativo tenta acessar outros sensores quando Sensores desativados está ativado, o tipo de sensor influencia o comportamento padrão:
- Sensores contínuos: Os sensores neste modo de relatório param de despachar eventos. Se um aplicativo estiver interagindo com um sensor contínuo quando Sensores desligados estiver ativado, o sensor não enviará dados adicionais ao aplicativo até que o recurso seja desativado.
- Eventos de liberação: uma liberação de sensor pode ser solicitada quando o bloco está habilitado e o retorno de chamada
onFlushComplete
é invocado para indicar que a liberação solicitada foi concluída com êxito, mas nenhum novo evento com dados do sensor é gerado e retornado ao retorno de chamadaonSensorChanged
. - Eventos de mudança: Quando Sensores desligados está habilitado, nenhum novo evento de mudança é relatado.
- Eventos de disparo: Quando Sensores desligados está habilitado, os eventos de disparo param de ser gerados. Todos os eventos existentes são concluídos.
Costumização
Se seus dispositivos usarem a implementação padrão de SensorService
, CameraService
e AudioPolicyService
, nenhuma personalização adicional será necessária para o design de referência. No entanto, você pode oferecer suporte a sensores gerenciados fora do SensorManager
, remover Sensores desativados de seus dispositivos ou alterar a interface do usuário do sistema para os blocos de configurações rápidas do desenvolvedor ou o ícone para o bloco Sensores desativados .
Suportando mais sensores
Se seus dispositivos contiverem sensores gerenciados fora do SensorManager
, você deverá adicionar suporte para eles usando SensorPrivacyService
e SensorPrivacyManager
.
Quando o bloco Sensores desativados é alternado, SensorPrivacyService
invoca um retorno de chamada unidirecional para todos os ouvintes registrados. Quando esse retorno de chamada é recebido, o ouvinte registrado pode executar as etapas necessárias com base no estado do bloco. Se estiver ativado, todas as conexões existentes podem ser encerradas e retornar dados vazios e um sinalizador definido para evitar novas conexões. Se estiver desabilitado, o sinalizador pode ser redefinido 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 para um novo sensor.
- Implemente a interface
BnSensorPrivacyListener
. Para obter mais detalhes, consulteSensorPrivacyPolicy
emCameraService.h
. - Registre-se no
SensorPrivacyManager
e obtenha o estado do bloco na inicialização. Para obter mais detalhes, consulteSensorPrivacyPolicy::registerSelf
emCameraService.cpp
. - Lidar com as mudanças de estado de Sensores desligados no retorno de chamada. Para obter mais detalhes, consulte
SensorPrivacyPolicy::onSensorPrivacyChanged
eCameraService::blockAllClients
emCameraService.cpp
. - Impeça o acesso aos dados do sensor quando o bloco estiver ativado. Para obter mais detalhes, consulte a verificação da política de privacidade do sensor em
CameraService::validateClientPermissionsLocked
emCameraService.cpp
.
Remoção de sensores desligados
Como uma ferramenta de desenvolvedor para teste, Sensors off está oculto porque um usuário deve primeiro habilitar o modo de desenvolvedor e, em seguida, optar por disponibilizar o bloco nas configurações.
Se você não quiser oferecer suporte a Sensores desativados em seus dispositivos, remova a etiqueta de serviço de packages/apps/Settings/AndroidManifest.xml
. Se você remover a etiqueta de serviço, o bloco Sensores desativados não estará disponível para habilitação na página de blocos de configurações rápidas do desenvolvedor.
Alterando a IU dos Sensores
Há dois elementos que podem ser personalizados para a IU de Sensores desligados : o ícone exibido para o bloco de configurações rápidas do desenvolvedor e o ícone exibido na barra de status quando o bloco está 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 de desenvolvedor opcional, não há testes CTS para esse recurso.
Você pode testar manualmente instalando um aplicativo do Google Play que lê e exibe todos os sensores do dispositivo. Ao habilitar o bloco Sensores desativados , certifique-se de que nenhum dos valores dos sensores seja alterado, que o áudio do microfone esteja silencioso e que a câmera não esteja acessível.