앱은 다른 앱에서 재생 중인 동영상이나 오디오를 녹음할 수 있습니다. 이러한 앱은 MediaProjection
토큰을 올바르게 처리해야 합니다. 이 페이지에서는 방법을 설명합니다. 또한 기기 관리자가 화면 스냅샷을 녹화하는 기능을 사용 중지하는 방법과 오디오 앱이 다른 앱이 재생하는 콘텐츠를 녹화하지 못하도록 하는 방법도 보여줍니다.
MediaProjection
토큰 처리 방법
MediaProjection
API를 사용하면 앱이 화면 콘텐츠 또는 오디오를 캡처할 수 있는 일회성 액세스 권한을 부여하는 MediaProjection
토큰을 획득할 수 있습니다. Android OS는 앱에 토큰을 부여하기 전에 사용자에게 권한을 요청합니다.
OS는 빠른 설정 UI에 활성 MediaProjection
토큰을 표시하고 사용자가 언제든지 토큰에 대한 액세스 권한을 취소할 수 있도록 허용합니다. 이 경우 세션과 연결된 가상 디스플레이 또는 오디오 스트림이 미디어 스트림 수신을 중지합니다. 앱은 적절하게 응답해야 합니다. 그렇지 않으면 오디오 무음 또는 검은색 동영상 스트림이 계속 녹화됩니다.
토큰 손실을 처리하려면 registerCallback
메서드를 사용하여 MediaProjection
인스턴스에 콜백을 등록하고 onStop
메서드가 호출될 때 녹화를 중지합니다.
자세한 내용은 미디어 프로젝션을 참고하세요.
동영상 촬영
Media Projection API를 사용하여 기기의 화면을 실시간으로 캡처하고 SurfaceView에 표시하는 방법을 알아보려면 ScreenCapture 샘플 앱을 참고하세요.
DevicePolicyManager
를 사용하여 화면 녹화를 방지할 수 있습니다. 기업 계정 (Android for Work)의 경우 관리자는 setScreenCaptureDisabled 메서드를 사용하여 직장 프로필에 관한 어시스턴트 데이터 수집을 중지할 수 있습니다.
앱 없이 Android 기기 관리 Codelab에서는 스크린샷을 금지하는 방법을 보여줍니다.
오디오 재생 캡처
AudioPlaybackCapture API는 Android 10에서 도입되었습니다. 이 API를 사용하면 앱이 다른 앱에서 재생되는 오디오를 복사할 수 있습니다. 이 기능은 화면 캡처와 유사하지만 오디오용입니다. 기본 사용 사례는 게임에서 재생되는 오디오를 캡처하려는 스트리밍 앱에 적합합니다.
AudioPlaybackCapture API는 오디오가 캡처되는 앱의 지연 시간에 영향을 미치지 않습니다.
캡처 앱 빌드
보안과 개인정보 보호를 위해 재생 캡처는 몇 가지 제한을 적용합니다. 오디오를 캡처하려면 앱이 다음과 같은 요구 사항을 충족해야 합니다.
- 앱에
RECORD_AUDIO
권한이 있어야 합니다. - 앱은
MediaProjectionManager.createScreenCaptureIntent()
에서 표시하는 메시지를 표시해야 하며 사용자가 이를 승인해야 합니다. - 캡처하는 앱과 오디오를 재생하는 앱은 동일한 사용자 프로필에 있어야 합니다.
다른 앱에서 오디오를 캡처하려면 앱이 AudioRecord
객체를 빌드하고 이 객체에 AudioPlaybackCaptureConfiguration
를 추가해야 합니다. 다음 단계를 따르세요.
AudioPlaybackCaptureConfiguration.Builder.build()
를 호출하여AudioPlaybackCaptureConfiguration
를 빌드합니다.setAudioPlaybackCaptureConfig
를 호출하여 구성을AudioRecord
에 전달합니다.
오디오 캡처 제어
앱은 녹화할 수 있는 콘텐츠 유형과 자체 재생을 녹화할 수 있는 다른 종류의 앱을 제어할 수 있습니다.
오디오 콘텐츠별로 캡처 제한
앱은 다음과 같은 메서드를 사용하여 캡처할 수 있는 오디오를 제한할 수 있습니다.
- 특정 용도의 캡처를 허용하려면
AUDIO_USAGE
를 AudioPlaybackCaptureConfiguration.addMatchingUsage()에 전달합니다. 메소드를 여러 번 호출하여 여러 사용을 지정할 수 있습니다. - 특정 사용 캡처를 금지하려면
AUDIO_USAGE
를 AudioPlaybackCaptureConfiguration.excludeUsage()에 전달합니다. 메소드를 여러 번 호출하여 여러 사용을 지정할 수 있습니다. - UID를 AudioPlaybackCaptureConfiguration.addMatchingUid()에 전달하면 특정 UID가 있는 앱만 캡처합니다. UID를 둘 이상 지정하려면 이 메서드를 여러 번 호출하세요.
- 특정 UID 캡처를 금지하려면 UID를 AudioPlaybackCaptureConfiguration.excludeUid()에 전달합니다. 메소드를 여러 번 호출하여 여러 UID를 지정할 수 있습니다.
addMatchingUsage()
및 excludeUsage()
메서드는 함께 사용할 수 없습니다. 반드시 둘 중 하나를 선택해야 합니다. 마찬가지로 addMatchingUid()
와 excludeUid()
를 동시에 사용할 수 없습니다.
다른 앱의 캡처 제한
다른 앱이 오디오를 캡처하지 못하도록 앱을 구성할 수 있습니다. 앱의 오디오는 그 앱이 다음 요구사항을 충족하는 경우에만 캡처될 수 있습니다.
사용
오디오를 재생하는 플레이어는 용도를 USAGE_MEDIA
, USAGE_GAME
또는 USAGE_UNKNOWN
로 설정해야 합니다.
캡처 정책
플레이어의 캡처 정책은 다른 앱이 재생을 캡처하도록 허용하는 AudioAttributes.ALLOW_CAPTURE_BY_ALL
여야 합니다. 이렇게 하는 방법은 여러 가지가 있습니다.
- 모든 플레이어에서 캡처를 사용 설정하려면 앱의
manifest.xml
파일에android:allowAudioPlaybackCapture="true"
를 포함합니다. 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 | 시스템만 | 시스템만 | 캡처 안 함 |