Sensores desligados

No modo avião, os dispositivos ainda podem acessar alguns sensores para ativar funcionalidades específicas, como rotação da tela e tirar fotos. O Android 10 oferece uma configuração de opções de desenvolvedor para desligar todos os sensores em um dispositivo. Esse recurso ajuda os desenvolvedores a testar a funcionalidade de seus aplicativos 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 ativa Sensores desativados 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 chamadas telefônicas.

Implementação

O Android 10 inclui uma implementação de referência que controla a câmera, o microfone e os sensores SensorManager . O serviço do sistema que gerencia o estado dos 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 uma aplicação 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 no 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 na primeira tentativa de adquirir a câmera quanto quando ela não está mais disponível. Isso normalmente resulta na falha do aplicativo quando esse bloco está ativado, mas 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á manipulando corretamente o retorno de chamada onError em CameraDevice.StateCallback . Quando Sensores desligados está habilitado, 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 em CameraDevice até que uma chamada openCamera subsequente seja bem-sucedida.

Comportamento do sensor

Quando Sensores desligados está ativado, os sensores param de reportar quaisquer dados ao sistema ou aos aplicativos. Um aplicativo ainda pode solicitar um sensor e registrar um ouvinte quando Sensores desligados estiver habilitado, mas o silêncio será retornado para o microfone ou o retorno de chamada onSensorChanged nunca será 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 a necessidade de realizar 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 ao método de retorno de chamada onError e CameraDevice será fechado.

Se um aplicativo tentar acessar a câmera quando Sensores desligados 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 desligados 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 desligados está ativado, o tipo de sensor influencia o comportamento padrão:

  • Sensores contínuos: os sensores neste modo de relatório param de enviar 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 do 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 alteração: quando Sensores desligados está ativado, nenhum novo evento de alteração é relatado.
  • Eventos de gatilho: quando Sensores desligados está ativado, os eventos de gatilho 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 no design de referência. No entanto, você pode oferecer suporte a sensores gerenciados fora do SensorManager , remover Sensores desligados de seus dispositivos ou alterar a UI do sistema para os blocos de configurações rápidas do desenvolvedor ou o ícone para o bloco Sensores desligados .

Suporta 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 desligados é alternado, SensorPrivacyService invoca um retorno de chamada unidirecional para todos os ouvintes registrados. Quando esse retorno de chamada for recebido, o ouvinte registrado poderá 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 desativado, o sinalizador poderá 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 alterações de estado de sensores desligados no retorno de chamada. Para obter 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 obter mais detalhes, consulte a verificação da política de privacidade do sensor em CameraService::validateClientPermissionsLocked em CameraService.cpp .

Remover sensores

Como uma ferramenta de desenvolvedor para teste, Sensores desligados está oculto porque o usuário deve primeiro ativar 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 desligados não estará disponível para ativação na página de blocos de configurações rápidas do desenvolvedor.

Alterar a IU dos sensores

Há dois elementos que podem ser personalizados para a IU de Sensores desligados : o ícone exibido no 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 ferramenta opcional para desenvolvedores, 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 ativar o bloco Sensores desligados , 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.