You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14下复用MediaProjection Intent实现多次屏幕录制的问题

Android 14 实现单次授权、服务存活期内多次启动录屏的方案

开发的Android录屏应用支持通过应用内或前台服务通知栏启动录制,在Android 14之前,通过保存MediaProjection授权Intent并复用,可实现用户单次授权后多次启动录制。但Android 14预览版中抛出SecurityException,禁止复用同一Intent创建MediaProjection,也禁止同一MediaProjection多次创建VirtualDisplay。复用单个VirtualDisplay虽可行,但会持续显示系统录制UI、浪费资源,用户停止后VirtualDisplay失效,暂移除了通知栏启动功能,寻求更优方案。

可行方案1:单MediaProjection+单VirtualDisplay,动态控制录制帧处理

核心思路是仅创建一次MediaProjection和VirtualDisplay,通过控制是否处理VirtualDisplay输出的帧来实现录制启停,而非销毁重建组件:

  • 具体步骤:
    1. 首次授权后,直接创建MediaProjection实例,同时创建ImageReader作为VirtualDisplay的目标Surface,完成VirtualDisplay的初始化。
    2. 启动录制时,将ImageReader回调获取的帧数据转发给MediaRecorder或自定义编码器的Surface;停止录制时,直接丢弃帧数据,暂停编码写入操作。
    3. 将MediaProjection和VirtualDisplay实例与前台服务绑定,确保服务存活期间不被销毁。
  • 优化细节:
    • 系统会在VirtualDisplay存活期间持续显示录制状态图标,需在应用前台通知中明确区分“待命(已授权)”和“正在录制”状态,避免用户误解。
    • 暂停录制时可降低ImageReader的帧采样率(如从60fps降至5fps),减少资源消耗;恢复录制时再调回正常采样率。

可行方案2:透明Activity触发授权(备选)

若无法接受方案1的系统UI提示,可采用此方案优化重复授权的用户体验:

  • 当用户点击通知栏启动录制时,启动一个完全透明、无交互的Activity,在该Activity内发起mediaProjectionManager.createScreenCaptureIntent()授权请求。
  • 授权完成后立即销毁透明Activity,自动回到用户当前操作的应用,同时启动录制流程。
  • 此方案完全符合Android 14的安全限制,但用户每次启动录制都需完成授权,体验略逊于方案1。

核心限制与规避要点

  • 禁止复用授权Intent:Android 14明确限制同一onActivityResult返回的Intent只能创建一次MediaProjection,首次授权后需直接持有MediaProjection实例,而非保存Intent。
  • 禁止多VirtualDisplay共享MediaProjection:必须保证一个MediaProjection对应唯一的VirtualDisplay,通过帧处理控制启停,而非重建VirtualDisplay。
  • 绑定前台服务:将MediaProjection和VirtualDisplay与前台服务绑定,避免系统回收,确保授权状态在服务存活期间持续有效。

内容的提问来源于stack exchange,提问作者jhain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:43:19