录制视频和音频播放内容

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

如何处理 MediaProjection 令牌

借助 MediaProjection API ,应用可以获取 MediaProjection 令牌,从而获得一次性访问权限 来捕获屏幕内容或音频。Android OS 会在向您的应用授予令牌之前征求用户的许可。

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

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

如需了解详情,请参阅媒体投屏

拍摄视频

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

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

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

捕获播放的音频

AudioPlaybackCapture API 是在 Android 10 中引入的。应用可以借助此 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

由于可以在多个位置指定捕获政策,因此务必要了解如何确定有效政策。 应始终应用最严格的捕获政策。例如,即使将 AudioManager#setAllowedCapturePolicy 设置 为 ALLOW_CAPTURE_BY_ALL,清单中包含 setAllowedCapturePolicy="false" 的应用也决不会允许非系统 应用捕获其音频。同样,如果将 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 仅限系统 仅限系统 无法捕获