Приложение может записывать видео или аудио, воспроизводимое из другого приложения. Такие приложения должны правильно обрабатывать токен MediaProjection
. На этой странице объясняется, как это сделать. Здесь также показано, как администратор устройства может отключить возможность записи любых снимков экрана и как аудиоприложение может запретить другим приложениям записывать воспроизводимый им контент.
Как обращаться с токеном MediaProjection
API MediaProjection
позволяет приложениям получать токен MediaProjection
, который дает им одноразовый доступ для захвата содержимого экрана или звука. ОС Android запрашивает у пользователя разрешение, прежде чем предоставить токен вашему приложению.
ОС отображает активные токены MediaProjection
в пользовательском интерфейсе быстрых настроек и позволяет пользователям в любое время отозвать доступ к токену. Когда это происходит, виртуальные дисплеи или аудиопотоки, связанные с сеансом, перестают получать медиапотоки. Ваше приложение должно реагировать соответствующим образом, иначе оно продолжит записывать тишину или черный видеопоток.
Чтобы справиться с потерей токена, зарегистрируйте обратный вызов в экземпляре MediaProjection
с помощью метода registerCallback
и остановите запись при вызове метода onStop
.
Для получения дополнительной информации см. Медиапроекция .
Захват видео
См. пример приложения ScreenCapture , чтобы узнать, как использовать API Media Projection для захвата экрана устройства в реальном времени и отображения его на 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
приложения.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)
, тогда этот медиаплеер не будет доступен для захвата несистемными устройствами. приложения.
В таблице ниже суммирован эффект атрибута манифеста и действующей политики:
разрешитьAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
истинный | любое приложение | только система | нет захвата |
ЛОЖЬ | только система | только система | нет захвата |