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