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输出的帧来实现录制启停,而非销毁重建组件:
- 具体步骤:
- 首次授权后,直接创建
MediaProjection实例,同时创建ImageReader作为VirtualDisplay的目标Surface,完成VirtualDisplay的初始化。 - 启动录制时,将
ImageReader回调获取的帧数据转发给MediaRecorder或自定义编码器的Surface;停止录制时,直接丢弃帧数据,暂停编码写入操作。 - 将
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
相关产品推荐
相关产品推荐

