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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:15:06