应用可以录制其他应用正在播放的视频或音频。此类
应用必须处理
MediaProjection
令牌
正确。本页将介绍具体操作方法。该图还展示了设备管理员可以如何停用
录制任何屏幕快照的功能,以及音频应用如何防止
让其他应用无法录制其播放的内容
如何处理 MediaProjection
令牌
MediaProjection
API
允许应用获取 MediaProjection
令牌,以便获得一次性访问权限
来截取屏幕内容或音频。Android 操作系统要求用户提供
权限。
操作系统在快捷设置界面中显示有效的 MediaProjection
令牌,并且
允许用户随时撤销对令牌的访问权限。出现这种情况时
停止接收与会话相关的虚拟显示屏或音频流
媒体流。您的应用必须做出适当响应,否则它会继续
录制无声视频或黑屏视频。
如需处理令牌丢失,请在 MediaProjection
上注册回调
使用
registerCallback
方法,并在发生
onStop
方法。
如需了解详情,请参阅媒体投影。
拍摄视频
请参阅 ScreenCapture 示例应用 学习如何使用 Media Projection API 来捕获设备的 并在 SurfaceView 上显示它。
您可以使用 DevicePolicyManager
以防止屏幕录制。对于企业账号 (Android for Work),
管理员可以为工作资料停用 Google 助理数据收集
使用
setScreenCaptureDisabled
方法。
Codelab 在不使用应用的情况下管理 Android 设备 展示了如何禁止屏幕截图。
捕获音频播放
AudioPlaybackCapture API 是在 Android 10 中引入的。此 API 可让应用复制其他应用正在播放的音频。这个 功能类似于屏幕截图,但针对的是音频。主要应用场景是 。
请注意,对于正在播放音频的应用,AudioPlaybackCapture API 不会影响该应用的延迟时间。 错误。
构建捕获应用
为确保安全和隐私,“捕获播放的音频”功能会施加一些限制。 为了能够捕获音频,应用必须满足以下要求:
- 该应用必须具有
RECORD_AUDIO
权限。 - 应用必须调出
MediaProjectionManager.createScreenCaptureIntent()
、 并且必须获得用户的批准 - 捕获和播放音频的应用必须使用同一份用户个人资料。
如需从其他应用捕获音频,您的应用必须构建
AudioRecord
对象
并添加
AudioPlaybackCaptureConfiguration
。请按以下步骤操作:
- 调用
AudioPlaybackCaptureConfiguration.Builder.build()
来构建AudioPlaybackCaptureConfiguration
。 - 通过调用以下方法将配置传递给
AudioRecord
:setAudioPlaybackCaptureConfig
。
控制音频捕获
应用可以控制可录制的内容类型,以及可录制的其他内容类型 各种类型的应用都可以自行录制播放过程。
按音频内容限制捕获
应用可以使用 方法:
- 将
AUDIO_USAGE
传递给 AudioPlaybackCaptureConfiguration.addMatchingUsage() 以允许捕获特定用法多次调用该方法可指定多个用法。 - 将
AUDIO_USAGE
传递到 AudioPlaybackCaptureConfiguration.excludedUsage() 可 禁止捕获该使用情况多次调用该方法可指定多个用法。 - 将 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
由于可以在多个位置指定捕获政策,因此请务必
来了解有效政策是如何确定的。
系统始终会应用最严格的捕获政策。例如,一款应用
清单包含 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 | 仅限系统 | 仅限系统 | 无法捕获 |