播放捕捉
Android Q包含一个新的AudioPlaybackCapture API。此API使应用程序能够复制其他应用程序正在播放的音频。此功能是屏幕捕获的模拟,但适用于音频。主要用例是用于想要捕获游戏正在播放的音频的流媒体应用。
请注意,捕获API不会影响正在捕获其音频的应用的延迟。
构建捕获应用程序
先决条件
为了安全和隐私,播放捕获带来了一些限制。为了能够捕获音频,应用必须满足以下要求:
- 该应用必须拥有该
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
文件中。 - 您还可以通过致电在所有玩家上启用捕获
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
。 - 您可以在使用时为单个播放器设置策略
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
。(如果您正在使用AAudio
电话AAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
。)
如果满足这些先决条件,则可以捕获播放器产生的任何音频。
注意:应用程序音频的捕获能力也取决于应用程序targetSdkVersion
。
- 默认情况下,针对Android 9.0版本(包括Android版本)的应用程序不允许回放捕获。要启用它,请包含
android:allowAudioPlaybackCapture="true"
在应用程序的manifest.xml
文件中。 - 默认情况下,定位Android Q或更高版本的应用会允许捕获其音频。要禁用播放捕获,请包含
android:allowAudioPlaybackCapture="false"
在应用程序的manifest.xml
文件中。
禁用系统捕获
允许上述捕获的保护仅适用于应用程序。Android系统组件忽略这些约束,并且可以默认捕获回放。其中许多组件都是由Android供应商定制的,并支持可访问性和字幕等功能。因此,建议应用程序允许系统捕获其播放。在极少数情况下,当您不希望系统捕获应用程序的播放时,请将捕获策略设置为 ALLOW_CAPTURE_BY_NONE
。
在运行时设置策略
您可以AudioManager.setAllowedCapturePolicy()
在应用程序运行时调用更改捕获策略。如果在调用方法时正在播放MediaPlayer或AudioTrack,则音频不受影响。您必须关闭并重新打开播放器或跟踪以使策略更改生效。
Policy = manifest + 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 |
---|---|---|---|
真 | 任何应用程序 | 系统 | 没有捕获 |
假 | 系统 | 系统 | 没有捕获 |