Приложение может записывать видео или аудио, воспроизводимое другим приложением. Такие приложения должны корректно обрабатывать токен 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 . Выполните следующие шаги:
- Вызовите метод
AudioPlaybackCaptureConfiguration.Builder.build()для создания объектаAudioPlaybackCaptureConfiguration. - Передайте конфигурацию в
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:allowAudioPlaybackCapture="true"в файлmanifest.xmlприложения. - Вы также можете включить захват звука для всех проигрывателей, вызвав метод
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Вы можете установить политику для отдельного проигрывателя при его создании, используя
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Если вы используетеAAudioвызовитеAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_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 |
|---|---|---|---|
| истинный | любое приложение | только система | нет захвата |
| ЛОЖЬ | только система | только система | нет захвата |