Датчики выключены

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

  1. BnSensorPrivacyListener интерфейс BnSensorPrivacyListener. Дополнительные сведения см. в разделе SensorPrivacyPolicy в CameraService.h .
  2. Зарегистрируйтесь в SensorPrivacyManager и получите состояние плитки при запуске. Дополнительные сведения см. в разделе SensorPrivacyPolicy::registerSelf в CameraService.cpp .
  3. Обработка изменений состояния отключения датчиков в обратном вызове. Дополнительные сведения см. SensorPrivacyPolicy::onSensorPrivacyChanged и CameraService::blockAllClients в CameraService.cpp .
  4. Запретить доступ к данным датчика, когда плитка включена. Дополнительные сведения см. в проверке политики конфиденциальности сенсора в 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, которое считывает и отображает все датчики устройства. Когда вы включаете плитку « Датчики выключены », убедитесь, что ни одно из значений датчиков не изменилось, звук микрофона отключен, а камера недоступна.