Приложение может записывать видео или аудио, воспроизводимое другим приложением. Такие приложения должны корректно обрабатывать токен MediaProjection . На этой странице объясняется, как это сделать. Здесь также показано, как администратор устройства может отключить возможность записи снимков экрана и как аудиоприложение может предотвратить запись воспроизводимого им контента другими приложениями.
Как работать с токеном MediaProjection
API MediaProjection позволяет приложениям получать токен MediaProjection , который дает им одноразовый доступ к захвату содержимого экрана или звука. Операционная система Android запрашивает разрешение пользователя, прежде чем предоставить токен вашему приложению.
Операционная система отображает активные токены MediaProjection в пользовательском интерфейсе быстрых настроек и позволяет пользователям в любой момент отозвать доступ к токену. В этом случае виртуальные дисплеи или аудиопотоки, связанные с сессией, перестают получать медиапотоки. Ваше приложение должно соответствующим образом реагировать, иначе оно продолжит записывать звук в тишине или видеопоток будет черным.
Для обработки потери токена зарегистрируйте функцию обратного вызова в экземпляре MediaProjection , используя метод registerCallback , и остановите запись при вызове метода onStop .
Для получения более подробной информации см. раздел «Проекция СМИ» .
Запись видео
Для предотвращения записи экрана можно использовать 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.Builder.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).)
Если эти условия выполнены, любой звук, воспроизводимый плеером, может быть записан.
Отключение захвата системы
The protections permitting capture described above apply only to apps. Android system components can capture playback by default. Many of these components are customized by Android vendors and support features like accessibility and captioning. For this reason it is recommended that apps allow the system to capture their playback. In the rare case when you do not want the system to capture your app's playback, set the capture policy to ALLOW_CAPTURE_BY_NONE .
Настройка политики во время выполнения
Вы можете вызвать AudioManager.setAllowedCapturePolicy() , чтобы изменить политику захвата звука во время работы приложения. Если во время вызова метода воспроизводится MediaPlayer или AudioTrack, звук не будет затронут. Для вступления изменений в силу необходимо закрыть и снова открыть плеер или трек.
Политика = манифест + AudioManager + AudioAttributes
Since the capture policy can be specified in several places, it's important to understand how the effective policy is determined. The most restrictive capture policy is always applied. For example, an app whose manifest includes setAllowedCapturePolicy="false" will never permit non-system apps to capture its audio, even if AudioManager#setAllowedCapturePolicy is set to ALLOW_CAPTURE_BY_ALL . Similarly, if the AudioManager#setAllowedCapturePolicy is set to ALLOW_CAPTURE_BY_ALL and the manifest sets setAllowedCapturePolicy="true" , but the media player's AudioAttributes were built with AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) , then this media player will not be capturable by non-system apps.
В таблице ниже приведено краткое описание влияния явного атрибута и действующей политики:
| allowAudioPlaybackCapture | РАЗРЕШИТЬ ЗАПИСЬ ДЛЯ ВСЕХ | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| истинный | любое приложение | только система | нет захвата |
| ЛОЖЬ | только система | только система | нет захвата |