Android 11后台启动录屏仅显缩略图无法播放、音频初始化失败问题
核心报错:
IAudioFlinger.createRecord返回错误-1,AudioRecord创建录音轨道失败,初始化native AudioRecord对象时报错误码-20,最终MediaAudioEncoder初始化AudioRecord失败。仅Android 11系统复现:应用在返回栈(后台)时启动录屏,系统仅显示屏幕投射选项,无“应用正在使用麦克风”提示,录制生成的视频文件体积极小、仅显示缩略图无法正常播放,其余Android版本无异常。
问题根因
该异常由Android 11(API 30)新增的后台麦克风访问权限强制限制导致,和编码器、屏幕投射权限逻辑无关:
- Android 11开始,应用未处于前台可见状态时,系统权限层会直接拦截麦克风采集请求,不会触发麦克风使用提示,也不会给应用分配音频输入资源
- 日志里的createRecord返回-1、native初始化错误码-20(对应
AudioRecord.ERROR_INVALID_OPERATION)都是系统权限拦截的标准返回值 - 音频轨道初始化失败后,媒体复用器只写入了少量视频帧头信息,所以最终输出的文件体积极小,只能显示缩略图无法正常播放
修复方案
按优先级落地以下调整即可解决该问题:
- 强制录屏启动流程在应用前台状态执行
不要在Activity退到返回栈、后台Service无界面附着的状态下直接调用startRecording。可以通过ProcessLifecycleOwner监听应用生命周期,仅在应用处于STARTED/RESUMED前台状态时执行录屏启动逻辑;如果是通过通知栏按钮触发录屏,先配置PendingIntent拉起一个透明主题的Activity把应用切到前台,等页面onResume回调后再真正启动录屏和音频采集。已经初始化完成的AudioRecord在应用切后台后可以正常继续采集,不会被系统中断。 - 补全权限与前台服务配置
在AndroidManifest.xml中补充对应配置,适配Android 11的服务权限要求:
注意:非系统签名的第三方应用即便配置了上述权限,在应用完全不可见的后台状态下启动录音,系统依然会弹出权限确认弹窗,无法静默启动采集,因此优先使用前台触发录屏的方案,兼容性覆盖最广。<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Android 11 专属后台麦克风访问权限 --> <uses-permission android:name="android.permission.RECORD_BACKGROUND_AUDIO" /> <service android:name=".ScreenRecordService" android:exported="false" android:foregroundServiceType="mediaProjection|microphone" /> - 增加音频初始化失败的降级逻辑
在MediaAudioEncoder的AudioRecord初始化位置加状态校验,如果初始化失败直接跳过音频轨道录制,不要阻塞视频轨道写入,避免输出损坏的视频文件:val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) audioRecord = AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, minBufferSize) if (audioRecord?.state != AudioRecord.STATE_INITIALIZED) { audioRecord?.release() audioRecord = null Log.w("MediaAudioEncoder", "AudioRecord init failed, skip audio track") return@init }
验证标准
修复后在Android 11设备上验证满足以下表现即为正常:
- 应用前台启动录屏时,状态栏正常弹出“应用正在使用麦克风”的系统提示
- 录屏过程中切后台,音频采集不会中断
- 录制生成的文件大小和录制时长匹配,音画同步可正常播放
内容的提问来源于stack exchange,提问作者Muhammad Sajid
相关产品推荐
相关产品推荐

