录制视频和音频播放内容

应用可以录制其他应用正在播放的视频或音频。此类应用必须正确处理 MediaProjection 令牌。本页介绍了操作方法。还介绍了设备管理员可以如何停用录制任何屏幕快照的功能,以及音频应用如何阻止其他应用录制其播放的内容。

如何处理 MediaProjection 令牌

应用可以使用 MediaProjection API 获取 MediaProjection 令牌,该令牌可让应用获取一次性捕获屏幕内容或音频的权限。Android 操作系统在向您的应用授予令牌之前要求用户提供权限。

操作系统会在“快捷设置”界面中显示有效的 MediaProjection 令牌,并允许用户随时撤消对令牌的访问权限。发生这种情况时,与会话关联的虚拟屏幕或音频流会停止接收媒体流。您的应用必须做出适当的响应,否则它将继续录制无声音频或黑屏。

如需处理令牌丢失的问题,请使用 registerCallback 方法在 MediaProjection 实例上注册回调,并在调用 onStop 方法时停止记录。

拍摄视频

请参阅 ScreenCapture 示例应用,了解如何使用 Media Projection API 实时截取设备屏幕并将其显示在 SurfaceView 上。

您可以使用 DevicePolicyManager 阻止屏幕录制。对于企业帐号 (Android for Work),管理员可以使用 setScreenCaptureDisabled 方法停用工作资料的 Google 助理数据收集功能。

在不使用应用的情况下管理 Android 设备 Codelab 中展示了如何禁止使用屏幕截图。

录制音频播放内容

Android 10 中引入了 AudioPlaybackCapture API。借助此 API,应用能够复制其他应用正在播放的音频。此功能类似于屏幕截图,但针对的是音频。主要用例是想要捕获游戏当前播放的音频的在线影音应用。

请注意,对于正在捕获音频的应用,AudioPlaybackCapture API 不会影响该应用的延迟时间。

构建捕获应用

出于安全和隐私考虑,捕获播放的音频功能会施加一些限制。为了能够捕获音频,应用必须满足以下要求:

如需从其他应用捕获音频,您的应用必须构建一个 AudioRecord 对象,并向其添加 AudioPlaybackCaptureConfiguration。请按以下步骤操作:

  1. 调用 AudioPlaybackCaptureConfiguration.Builder.build() 以构建 AudioPlaybackCaptureConfiguration
  2. 通过调用 setAudioPlaybackCaptureConfig 将配置传递给 AudioRecord

控制音频捕获

您的应用可以控制它可以录制哪些类型的内容,以及哪些类型的应用可以录制自己的播放内容。

按音频内容限制捕获

应用可以使用以下方法限制它可以捕获的音频:

请注意,您不能同时使用 addMatchingUsage()excludeUsage() 方法。您必须选择其中之一。同样,您不能同时使用 addMatchingUid()excludeUid()

限制其他应用的拍摄

您可以配置应用,以防止其他应用捕获其音频。 只有当应用满足以下要求时,才可以捕获来自该应用的音频:

用法

生成音频的播放器必须将其用途设为 USAGE_MEDIAUSAGE_GAMEUSAGE_UNKNOWN

捕获政策

播放器的捕获政策必须为 AudioAttributes.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 仅限系统 仅限系统 无捕获