В режиме полета устройства по-прежнему могут получать доступ к некоторым датчикам для включения определенных функций, таких как поворот экрана и фотосъемка. В 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, которое считывает и отображает все датчики устройства. При включении плитки «Датчики выключены» убедитесь, что ни одно из значений датчиков не изменяется, звук микрофона не слышен и камера недоступна.