Захват видео и воспроизведение звука

Приложение может записывать видео или аудио, воспроизводимое другим приложением. Такие приложения должны корректно обрабатывать токен MediaProjection . На этой странице объясняется, как это сделать. Здесь также показано, как администратор устройства может отключить возможность записи снимков экрана и как аудиоприложение может предотвратить запись воспроизводимого им контента другими приложениями.

Как работать с токеном MediaProjection

API MediaProjection позволяет приложениям получать токен MediaProjection , который дает им одноразовый доступ к захвату содержимого экрана или звука. Операционная система Android запрашивает разрешение пользователя, прежде чем предоставить токен вашему приложению.

Операционная система отображает активные токены MediaProjection в пользовательском интерфейсе быстрых настроек и позволяет пользователям в любой момент отозвать доступ к токену. В этом случае виртуальные дисплеи или аудиопотоки, связанные с сессией, перестают получать медиапотоки. Ваше приложение должно соответствующим образом реагировать, иначе оно продолжит записывать звук в тишине или видеопоток будет черным.

Для обработки потери токена зарегистрируйте функцию обратного вызова в экземпляре MediaProjection , используя метод registerCallback , и остановите запись при вызове метода onStop .

Для получения более подробной информации см. раздел «Проекция СМИ» .

Запись видео

Ознакомьтесь с примером приложения ScreenCapture , чтобы узнать, как использовать Media Projection API для захвата экрана устройства в реальном времени и отображения его на SurfaceView.

Для предотвращения записи экрана можно использовать DevicePolicyManager . Для корпоративных учетных записей (Android for Work) администратор может отключить сбор данных голосового помощника для рабочего профиля, используя метод setScreenCaptureDisabled .

В обучающем материале « Управление устройствами Android без приложения» показано, как запретить создание скриншотов.

Запись воспроизведения звука

API AudioPlaybackCapture был представлен в Android 10. Этот API позволяет приложениям копировать звук, воспроизводимый другими приложениями. Эта функция является аналогом захвата экрана, но для звука. Основное применение — для потоковых приложений, которые хотят захватывать звук, воспроизводимый играми.

Обратите внимание, что API AudioPlaybackCapture не влияет на задержку приложения, звук которого захватывается.

Создание приложения для захвата видео.

В целях безопасности и конфиденциальности захват воспроизведения накладывает некоторые ограничения. Для захвата звука приложение должно соответствовать следующим требованиям:

  • Приложение должно иметь разрешение RECORD_AUDIO .
  • Приложение должно отобразить запрос, показанный функцией MediaProjectionManager.createScreenCaptureIntent() , и пользователь должен его подтвердить.
  • Приложения для захвата и воспроизведения должны находиться в одном профиле пользователя.

Для захвата звука из другого приложения ваше приложение должно создать объект AudioRecord и добавить к нему объект AudioPlaybackCaptureConfiguration . Выполните следующие шаги:

  1. Вызовите метод AudioPlaybackCaptureConfiguration.Builder.build() для создания объекта AudioPlaybackCaptureConfiguration .
  2. Передайте конфигурацию в AudioRecord , вызвав setAudioPlaybackCaptureConfig .

Управление захватом звука

Ваше приложение может контролировать, какие типы контента оно может записывать, и какие другие приложения могут записывать собственное воспроизведение.

Ограничение захвата аудиоконтентом

Приложение может ограничить объем записываемого аудиосигнала, используя следующие методы:

  • Передайте параметр AUDIO_USAGE в метод AudioPlaybackCaptureConfiguration.addMatchingUsage() , чтобы разрешить захват конкретного случая использования. Вызовите метод несколько раз, чтобы указать более одного случая использования.
  • Передайте параметр AUDIO_USAGE в метод AudioPlaybackCaptureConfiguration.excludeUsage() , чтобы запретить захват этого варианта использования. Вызывайте метод несколько раз, чтобы указать более одного варианта использования.
  • Передайте UID в метод AudioPlaybackCaptureConfiguration.addMatchingUid() , чтобы захватывать только приложения с определенным UID. Вызовите метод несколько раз, чтобы указать более одного UID.
  • Передайте UID в метод AudioPlaybackCaptureConfiguration.excludeUid() , чтобы запретить захват этого UID. Вызовите метод несколько раз, чтобы указать более одного UID.

Обратите внимание, что методы addMatchingUsage() и excludeUsage() нельзя использовать одновременно. Необходимо выбрать один из них. Аналогично, нельзя использовать addMatchingUid() и excludeUid() одновременно.

Ограничение захвата изображения другими приложениями.

Вы можете настроить приложение таким образом, чтобы оно не могло записывать звук из других приложений. Запись звука из приложения возможна только в том случае, если приложение соответствует следующим требованиям:

Использование

Плеер, воспроизводящий аудио, должен установить для него значение USAGE_MEDIA , USAGE_GAME или USAGE_UNKNOWN .

Политика захвата

Политика захвата воспроизведения плеера должна быть установлена AudioAttributes.ALLOW_CAPTURE_BY_ALL , что позволяет другим приложениям захватывать воспроизведение. Это можно сделать несколькими способами:

Если эти условия выполнены, любой звук, воспроизводимый плеером, может быть записан.

Отключение захвата системы

Описанные выше меры защиты, разрешающие захват воспроизведения, применяются только к приложениям. Компоненты системы Android по умолчанию могут захватывать воспроизведение. Многие из этих компонентов настраиваются разработчиками Android и поддерживают такие функции, как специальные возможности и субтитры. По этой причине рекомендуется, чтобы приложения разрешали системе захватывать их воспроизведение. В редких случаях, когда вы не хотите, чтобы система захватывала воспроизведение вашего приложения, установите политику захвата в значение ALLOW_CAPTURE_BY_NONE .

Настройка политики во время выполнения

Вы можете вызвать AudioManager.setAllowedCapturePolicy() , чтобы изменить политику захвата звука во время работы приложения. Если во время вызова метода воспроизводится MediaPlayer или AudioTrack, звук не будет затронут. Для вступления изменений в силу необходимо закрыть и снова открыть плеер или трек.

Политика = манифест + AudioManager + AudioAttributes

Поскольку политика захвата может быть задана в нескольких местах, важно понимать, как определяется действующая политика. Всегда применяется наиболее ограничительная политика захвата. Например, приложение, манифест которого содержит setAllowedCapturePolicy="false" никогда не позволит несистемным приложениям захватывать его звук, даже если AudioManager#setAllowedCapturePolicy установлен в ALLOW_CAPTURE_BY_ALL . Аналогично, если AudioManager#setAllowedCapturePolicy установлен в ALLOW_CAPTURE_BY_ALL , а в манифесте установлено setAllowedCapturePolicy="true" , но AudioAttributes медиаплеера были созданы с помощью AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) , то этот медиаплеер не будет доступен для захвата несистемными приложениями.

В таблице ниже приведено краткое описание влияния явного атрибута и действующей политики:

allowAudioPlaybackCapture РАЗРЕШИТЬ ЗАПИСЬ ДЛЯ ВСЕХ ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
истинный любое приложение только система нет захвата
ЛОЖЬ только система только система нет захвата