Cuando están en modo avión, los dispositivos aún pueden acceder a algunos sensores para habilitar funciones específicas, como la rotación de la pantalla y la toma de fotos. Android 10 proporciona una configuración de opciones para desarrolladores para apagar todos los sensores de un dispositivo. Esta función ayuda a los desarrolladores a probar la funcionalidad de sus apps en situaciones en las que esos sensores no están disponibles. Además, brinda a los usuarios una manera de controlar los sensores en sus dispositivos.
Cuando un desarrollador o usuario habilita Sensores desactivados en las opciones para desarrolladores (Configuración > Sistema > Opciones para desarrolladores > Azulejos de configuración rápida para desarrolladores), aparece una tarjeta nueva en la bandeja de configuración rápida. Pueden usar la tarjeta para evitar que las apps accedan a la cámara, al micrófono y a todos los sensores que administra la clase SensorManager
.
Advertencia: Esta opción solo afecta a las apps que acceden a los sensores a través de "SensorService", "CameraService" y "AudioPolicyService". Las funciones de telefonía no usan "AudioPolicyService" y aún tienen acceso al micrófono durante las llamadas telefónicas.
Implementación
Android 10 incluye una implementación de referencia que controla la cámara, el micrófono y los sensores SensorManager
. El servicio del sistema que administra el estado Sensores desactivados y notifica a los clientes sobre los cambios de estado se encuentra en frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
.
El administrador que facilita el acceso a SensorPrivacyService
dentro del contexto de una aplicación se encuentra en frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Si tus dispositivos usan la implementación predeterminada de SensorService
, CameraService
y AudioPolicyService
, no se necesita personalización adicional para el diseño de referencia. Si tienes otros sensores, consulta Personalización para obtener más detalles sobre cómo admitir esta función.
Problemas comunes
Cuando se implementa esta función, a veces las apps de cámara no responden correctamente a las devoluciones de llamada de onError
, tanto cuando se intenta adquirir la cámara por primera vez como cuando ya no está disponible. Por lo general, esto hace que la app falle cuando se habilita esta tarjeta, pero se puede usar como indicador para indicar que la función se comporta como se espera.
Este comportamiento indica que la app no controla correctamente la devolución de llamada onError
en CameraDevice.StateCallback
. Cuando se habilita Sensores desactivados, se invoca la devolución de llamada onError
con CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
establecido como el valor de error. Actualiza las apps propias para controlar la devolución de llamada de onError
con este valor. Para ello, no realices ninguna llamada posterior a CameraDevice
hasta que se realice correctamente una llamada posterior a openCamera
.
Comportamiento del sensor
Cuando se habilita Sensores desactivados, los sensores dejan de enviar datos al sistema o a las apps. Una app aún puede solicitar un sensor y registrar un objeto de escucha cuando se habilita Sensores desactivados, pero se muestra silencio para el micrófono o nunca se invoca la devolución de llamada onSensorChanged
para los sensores. En cuanto se inhabilita la tarjeta, esos mismos objetos de escucha comienzan a recibir el resultado real del micrófono o las devoluciones de llamada esperadas a onSensorChanged
sin necesidad de realizar ningún trabajo adicional. El comportamiento predeterminado de los sensores silenciados es el siguiente.
Cámara
Si una app usa la cámara cuando está habilitada la opción Sensores desactivados, se envía un error al método de devolución de llamada onError
y se cierra CameraDevice
.
Si una app intenta acceder a la cámara cuando está habilitada la opción Sensores desactivados, se envía un error al método de devolución de llamada onError
.
Micrófono
Cuando se habilita Sensores apagados, aún es posible acceder al micrófono, pero solo se muestra silencio. Si una app usa el micrófono cuando está habilitada la opción Sensores desactivados, no se genera un error, pero la grabación se silencia y solo muestra un array de ceros. Si se inhabilita Sensores apagados mientras la app sigue usando el micrófono, se muestran los datos de audio esperados.
Si una app intenta acceder al micrófono cuando está habilitada la opción Sensores apagados, el micrófono no emite sonido.
Sensor
Cuando una app intenta acceder a otros sensores cuando la opción Sensores desactivados está habilitada, el tipo de sensor influye en el comportamiento predeterminado:
- Sensores continuos: Los sensores en este modo de generación de informes dejan de enviar eventos. Si una app interactúa con un sensor continuo cuando está habilitada la opción Sensores desactivados, el sensor no envía datos adicionales a la app hasta que se inhabilita la función.
- Eventos de limpieza: Se puede solicitar una limpieza del sensor cuando la tarjeta está habilitada y se invoca la devolución de llamada
onFlushComplete
para indicar que la limpieza solicitada se completó correctamente, pero no se generan eventos nuevos con datos del sensor ni se devuelven a la devolución de llamadaonSensorChanged
. - Eventos cuando se producen cambios: Cuando se habilita la opción Sensores desactivados, no se informan eventos de cambio nuevos.
- Eventos de activación: Cuando se habilita Sensores desactivados, se dejan de generar eventos de activación. Que se completen todos los eventos existentes
Personalización
Si tus dispositivos usan la implementación predeterminada de SensorService
, CameraService
y AudioPolicyService
, no se necesita personalización adicional para el diseño de referencia. Sin embargo, puedes admitir sensores administrados fuera de SensorManager
, quitar Sensores desactivados de tus dispositivos o cambiar la IU del sistema para los mosaicos de configuración rápida para desarrolladores o el ícono de la tarjeta Sensores desactivados.
Admite más sensores
Si tus dispositivos contienen sensores administrados fuera de SensorManager
, debes agregar compatibilidad con ellos usando SensorPrivacyService
y SensorPrivacyManager
.
Cuando se activa la tarjeta Sensores desactivados, SensorPrivacyService
invoca una devolución de llamada unidireccional para todos los objetos de escucha registrados. Cuando se recibe esta devolución de llamada, el objeto de escucha registrado puede seguir los pasos necesarios según el estado de la tarjeta. Si está habilitada, se pueden finalizar todas las conexiones existentes y mostrar datos vacíos, y se establece una marca para evitar conexiones nuevas. Si está inhabilitada, se puede restablecer la marca para permitir conexiones nuevas. Con el servicio de la cámara (platform/frameworks/av/services/camera/libcameraservice/
) como ejemplo, sigue estos pasos para agregar compatibilidad con un sensor nuevo.
- Implementa la interfaz de
BnSensorPrivacyListener
. Para obtener más detalles, consultaSensorPrivacyPolicy
enCameraService.h
. - Regístrate con
SensorPrivacyManager
y obtén el estado de la tarjeta durante el inicio. Para obtener más información, consultaSensorPrivacyPolicy::registerSelf
enCameraService.cpp
. - Controla los cambios de estado de Sensores desactivados en la devolución de llamada. Para obtener más detalles, consulta
SensorPrivacyPolicy::onSensorPrivacyChanged
yCameraService::blockAllClients
enCameraService.cpp
. - Evita el acceso a los datos del sensor cuando la tarjeta está habilitada. Para obtener más detalles, consulta la verificación de la política de privacidad del sensor en
CameraService::validateClientPermissionsLocked
enCameraService.cpp
.
Cómo quitar la opción Sensores desactivados
Como herramienta para desarrolladores de pruebas, Sensores desactivados está oculta porque el usuario primero debe habilitar el modo de desarrollador y, luego, elegir que la tarjeta esté disponible en la configuración.
Si no quieres admitir la opción Sensores desactivados en tus dispositivos, quita la etiqueta de servicio de packages/apps/Settings/AndroidManifest.xml
. Si quitas la etiqueta de servicio, la tarjeta Sensores desactivados no estará disponible para habilitarla desde la página de tarjetas de configuración rápida para desarrolladores.
Cambia la IU de los sensores desactivados
Hay dos elementos que se pueden personalizar para la IU de Sensores desactivados: el ícono que se muestra para la tarjeta de configuración rápida del desarrollador y el ícono que se muestra en la barra de estado cuando la tarjeta está habilitada. Para personalizar el aspecto de estos íconos, reemplaza los siguientes archivos:
- Ícono de la tarjeta de Configuración rápida:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Ícono de la barra de estado:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Validación
Como herramienta opcional para desarrolladores, no hay pruebas de CTS para esta función.
Para realizar la prueba de forma manual, instala una app de Google Play que lea y muestre todos los sensores del dispositivo. Cuando habilites la tarjeta Sensores desactivados, asegúrate de que no cambie ninguno de los valores de los sensores, de que el audio del micrófono esté silenciado y de que no se pueda acceder a la cámara.