Android 11使用MediaRecorder录屏生成文件但无法正常录制视频求助
Android 11 MediaRecorder录屏仅生成3KB文件解决方案
核心问题原因
Android 11(API 30)对MediaProjection与MediaRecorder的绑定时序做了更严格的校验,你当前代码的调用顺序不符合Android 11的要求:先调用mediaRecorder.start()再创建VirtualDisplay绑定Surface,导致MediaRecorder无法读取到Surface传入的视频帧,仅写入了MP4文件头,所以文件大小固定为3KB左右。Android 10及以下系统无此时序校验,因此运行正常。
修复步骤
1. 调整调用顺序
将createVirtualDisplay()的调用时机移到mediaRecorder.prepare()之后、mediaRecorder.start()之前,修改后的代码片段如下:
try { mediaRecorder.prepare(); // 先创建VirtualDisplay绑定Surface,再启动Recorder createVirtualDisplay(); mediaRecorder.start(); //ScreenCaptureReceiver.getInstance().registerIntent(getApplicationContext(), filename, true); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } // 删除原逻辑中写在start()之后的createVirtualDisplay()调用
2. 检查权限与前台服务配置
如果你的应用targetSdk≥30,还需要补充以下配置:
- 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
- 启动录屏前必须启动类型为
mediaProjection的前台服务,Android 11不允许后台应用持有MediaProjection实例。
3. 校验虚拟显示参数
确保getVirtualDisplayFlags()返回符合系统要求的参数,参考实现:
private int getVirtualDisplayFlags() { int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; } return flags; }
4. 可选:适配编码器分辨率
部分设备的默认屏幕分辨率不在H264编码器支持的范围内,建议先通过MediaCodecList查询设备支持的最大编码分辨率,再设置videoSize,避免编码器初始化失败。
内容的提问来源于stack exchange,提问作者Milan Chauhan
相关产品推荐
相关产品推荐

