Приложение может записывать видео или аудио, воспроизводимое из другого приложения. Такие приложения должны правильно обрабатывать токен MediaProjection. Ниже описано, как это сделать. Также показано, как администратор устройства может отключить возможность записи любых снимков экрана и как аудиоприложение может запретить другим приложениям записывать воспроизводимый им контент.
Как обрабатывать токен MediaProjection
API MediaProjection позволяет приложениям получать токен MediaProjection, который дает им одноразовый доступ к записи экрана или аудио. Прежде чем предоставить токен вашему приложению, ОС Android запрашивает разрешение пользователя.
ОС показывает активные токены MediaProjection в интерфейсе быстрых настроек и позволяет пользователям в любой момент отозвать доступ к токену. В этом случае виртуальные экраны или аудиопотоки, связанные с сеансом, перестают получать медиапотоки. Приложение должно реагировать соответствующим образом, иначе оно продолжит записывать тишину или черный экран.
Чтобы обработать потерю токена, зарегистрируйте обратный вызов в экземпляре MediaProjection с помощью метода registerCallback и остановите запись, когда будет вызван метод onStop.
Подробнее о трансляции медиаконтента…
Снять видео
Чтобы запретить запись видео с экрана, используйте DevicePolicyManager. В корпоративных аккаунтах (Android for Work) администратор может отключить сбор данных Ассистента для рабочего профиля с помощью метода setScreenCaptureDisabled.
В практической работе Как управлять устройствами Android без приложения показано, как запретить скриншоты.
Запись воспроизводимого аудио
AudioPlaybackCapture API был представлен в Android 10. Этот API позволяет приложениям копировать аудио, воспроизводимое другими приложениями. Эта функция аналогична записи экрана, но для аудио. Основной вариант использования – потоковые сервисы, которые хотят записывать аудио из игр.
Обратите внимание, что AudioPlaybackCapture API не влияет на задержку приложения, аудио которого записывается.
Создание приложения для съемки
В целях безопасности и конфиденциальности для мгновенных повторов действуют некоторые ограничения. Чтобы приложение могло записывать аудио, оно должно соответствовать следующим требованиям:
- У приложения должно быть разрешение
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 в AudioPlaybackCaptureConfiguration.excludeUid(), чтобы запретить запись этого 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_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| true | любое приложение | только система | без записи |
| false | только система | только система | без записи |