应用可以录制其他应用正在播放的视频或音频。此类
应用必须正确处理
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 不会影响此应用的延迟时间。
构建捕获应用
为确保安全性和隐私,捕获播放的音频功能会施加一些限制。 如需捕获音频,应用必须满足以下要求:
- 应用必须拥有
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,这样其他应用才能捕获播放内容。此操作可以通过一些方法完成:
- 要在所有播放器上启用捕获功能,请在应用的
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)。)
如果满足这些前提条件,应用就可以捕获播放器生成的任何音频。
停用系统捕获
上述允许捕获的保护措施仅适用于应用。默认情况下,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 | 仅限系统 | 仅限系统 | 无法捕获 |