AudioPlaybackCapture API가 Android 10에 도입되었습니다. 이 API를 사용하면 앱이 다른 앱에서 재생되는 오디오를 복사할 수 있습니다. 이 기능은 화면 캡처와 유사한 방법으로 오디오를 캡처합니다. 기본적인 사용 사례로는 스트리밍 앱에서 게임에 재생되는 오디오를 캡처하는 것이 있습니다.
캡처 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를 AudioPlaybackCaptureConfiguration.excludeUid()로 전달하면 해당 UID의 캡처가 금지됩니다. 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 | 시스템만 허용 | 시스템만 허용 | 캡처 금지 |