В авиарежиме устройства могут получать доступ к некоторым датчикам, чтобы обеспечивать работу определенных функций, например поворота экрана и съемки фотографий. В Android 10 в настройках для разработчиков можно отключить все датчики на устройстве. Эта функция помогает разработчикам тестировать работу приложений в ситуациях, когда датчики недоступны, а пользователям – управлять датчиками на устройстве.
Когда разработчик или пользователь включает параметр Датчики выключены в разделе Для разработчиков (Настройки > Система > Для разработчиков > Значки для разработчиков в быстрых настройках), на панели быстрых настроек появляется новый значок. С помощью этой функции можно запретить приложениям доступ к камере, микрофону и всем датчикам, управляемым классом SensorManager.
Внимание! Этот параметр влияет только на приложения, которые получают доступ к датчикам через SensorService, CameraService и AudioPolicyService. Функции телефонии не используют AudioPolicyService и по-прежнему имеют доступ к микрофону во время звонков.
Реализация
В Android 10 есть эталонная реализация, которая управляет камерой, микрофоном и датчиками SensorManager. Системный сервис, который управляет состоянием Датчики отключены и уведомляет клиентов об изменениях состояния, находится в frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java.
Менеджер, который предоставляет доступ к SensorPrivacyService в контексте приложения, находится в frameworks/base/core/java/android/hardware/SensorPrivacyManager.java.
Если на ваших устройствах используется стандартная реализация SensorService, CameraService и AudioPolicyService, то дополнительная настройка референсного дизайна не требуется. Если у вас есть другие датчики, ознакомьтесь с разделом Настройка, чтобы узнать больше о поддержке этой функции.
Распространенные проблемы
При реализации этой функции приложения камеры иногда неправильно реагируют на обратные вызовы onError как при первой попытке получить доступ к камере, так и когда камера больше недоступна. Обычно при включении этой функции приложение аварийно завершает работу, но это можно использовать как сигнал того, что функция работает правильно.
Это означает, что приложение неправильно обрабатывает обратный вызов onError в CameraDevice.StateCallback. Если включена функция Отключить датчики, обратный вызов onError вызывается со значением ошибки CameraDevice.StateCallback.ERROR_CAMERA_DISABLED. Обновите собственные приложения, чтобы они обрабатывали обратный вызов onError с этим значением, не выполняя последующие вызовы CameraDevice, пока не будет успешно выполнен вызов openCamera.
Поведение датчиков
Когда параметр Датчики выключены включен, датчики перестают передавать данные системе и приложениям. Приложение может запросить доступ к датчику и зарегистрировать прослушиватель, даже если включен параметр Датчики отключены. Однако в этом случае микрофон не будет передавать звук, а обратный вызов onSensorChanged не будет выполняться. Как только плитка будет отключена, эти же слушатели начнут получать фактические данные с микрофона или ожидаемые обратные вызовы в onSensorChanged без каких-либо дополнительных действий. Режим работы по умолчанию для отключенных датчиков следующий:
Камера
Если приложение использует камеру, когда включена функция Отключить датчики, в метод обратного вызова onError отправляется ошибка и CameraDevice закрывается.
Если приложение пытается получить доступ к камере, когда включен параметр Отключить датчики, в метод обратного вызова onError отправляется ошибка.
Микрофон
Если включен параметр Отключить датчики, доступ к микрофону по-прежнему возможен, но возвращается только тишина. Если приложение использует микрофон, когда включена функция Отключить датчики, ошибка не возникает, но запись будет без звука и вернет массив нулей. Если отключить параметр Датчики выключены, пока приложение использует микрофон, будут возвращены ожидаемые аудиоданные.
Если приложение попытается получить доступ к микрофону, когда включен параметр Датчики отключены, микрофон не будет передавать звук.
Датчик
Если приложение пытается получить доступ к другим датчикам, когда параметр Датчики выключены включен, режим работы по умолчанию зависит от типа датчика:
- Датчики непрерывного действия. Датчики в этом режиме отчетов прекращают отправку событий. Если приложение взаимодействует с непрерывным датчиком, когда включена функция Отключить датчики, датчик не отправляет приложению дополнительные данные, пока функция не будет отключена.
- Сброс событий. Сброс датчика можно запросить, когда плитка включена и вызывается обратный вызов
onFlushComplete, чтобы указать, что запрошенный сброс успешно завершен, но новые события с данными датчика не генерируются и не возвращаются в обратный вызовonSensorChanged. - События изменения. Если функция Датчики отключены включена, новые события изменения не регистрируются.
- События-триггеры. Если параметр Датчики отключены включен, события-триггеры не генерируются. завершить все текущие события;
Настройка канала
Если на ваших устройствах используется реализация по умолчанию SensorService, CameraService и AudioPolicyService, то в эталонный дизайн не нужно вносить дополнительные изменения. Однако вы можете добавить поддержку датчиков, управляемых вне SensorManager, удалить Датчики отключены с устройств или изменить системный интерфейс для значков быстрых настроек разработчика или значок для плитки Датчики отключены.
Поддержка большего количества датчиков
Если на ваших устройствах есть датчики, управляемые не через SensorManager, добавьте их поддержку с помощью SensorPrivacyService и SensorPrivacyManager.
Когда переключатель Отключить датчики включен, SensorPrivacyService вызывает односторонний обратный вызов для всех зарегистрированных прослушивателей. Когда этот обратный вызов получен, зарегистрированный слушатель может предпринять необходимые действия в зависимости от состояния элемента. Если она включена, все существующие подключения могут быть прерваны и возвращать пустые данные, а также будет установлен флаг, запрещающий новые подключения. Если флаг отключен, его можно сбросить, чтобы разрешить новые подключения. Чтобы добавить поддержку нового датчика, выполните следующие действия (на примере сервиса камеры platform/frameworks/av/services/camera/libcameraservice/).
- Реализуйте интерфейс
BnSensorPrivacyListener. Подробнее о том, как это сделать, рассказывается в разделеSensorPrivacyPolicyстатьиCameraService.h. - Зарегистрируйтесь в
SensorPrivacyManagerи получите состояние элемента при запуске. Подробную информацию можно найти в разделеSensorPrivacyPolicy::registerSelfстатьиCameraService.cpp. - Обрабатывайте изменения состояния Датчики отключены в обратном вызове. Подробную информацию вы найдете в разделах
SensorPrivacyPolicy::onSensorPrivacyChangedиCameraService::blockAllClientsстатьиCameraService.cpp. - Запретить доступ к данным датчиков, когда параметр включен. Подробную информацию можно найти в разделе "Проверка политики конфиденциальности датчиков" в
CameraService::validateClientPermissionsLockedиCameraService.cpp.
Удалить датчики
Поскольку Датчики выкл. – это инструмент разработчика для тестирования, он скрыт. Чтобы сделать его доступным в настройках, пользователь должен сначала включить режим разработчика.
Если вы не хотите поддерживать функцию Датчики отключены на своих устройствах, удалите тег сервиса из packages/apps/Settings/AndroidManifest.xml. Если удалить тег сервиса, параметр Отключить датчики будет недоступен на странице быстрых настроек для разработчиков.
Как изменить интерфейс отключения датчиков
В интерфейсе Датчики выключены можно настроить два элемента: значок, который показывается в параметре быстрых настроек для разработчиков, и значок, который показывается в строке состояния, когда параметр включен. Чтобы настроить внешний вид этих значков, замените следующие файлы:
- Значок параметра быстрых настроек:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml - Значок в строке состояния:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Проверка
Поскольку это необязательный инструмент для разработчиков, для него не предусмотрены тесты CTS.
Вы можете протестировать устройство вручную, установив из Google Play приложение, которое считывает и отображает данные со всех датчиков. Когда вы включаете плитку Отключить датчики, убедитесь, что значения датчиков не меняются, микрофон не записывает звук, а камера недоступна.