Sensores desligados

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 chamada onSensorChanged .
  • 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.

  1. Implemente a interface BnSensorPrivacyListener . Para obter mais detalhes, consulte SensorPrivacyPolicy em CameraService.h .
  2. Registre-se no SensorPrivacyManager e obtenha o estado do bloco na inicialização. Para obter mais detalhes, consulte SensorPrivacyPolicy::registerSelf em CameraService.cpp .
  3. Lidar com as mudanças de estado de Sensores desligados no retorno de chamada. Para obter mais detalhes, consulte SensorPrivacyPolicy::onSensorPrivacyChanged e CameraService::blockAllClients em CameraService.cpp .
  4. 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 em CameraService.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.