Android 8.1.0录像报错:MediaRecorder.start()失败-19求助
嘿,这个错误我在适配Android 8.x版本时也碰到过,错误码-19对应的是MEDIA_ERROR_INVALID_STATE,说白了就是调用start()时,MediaRecorder没处在正确的就绪状态——要么是配置漏了关键步骤,要么是参数不兼容,也可能是资源冲突导致的。结合你贴的代码片段,我给你梳理几个核心排查方向:
先盯紧prepareRecorder()这个核心方法
这个方法是MediaRecorder能正常启动的前提,步骤顺序和配置项一个都不能错:
- 必须先设置音频源和视频源,顺序不能搞反:
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); - 输出格式优先用
MPEG_4,Android 8.1对这个格式兼容性最好,别用太冷门的格式:mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - 编码器要和输出格式匹配,音频用AAC、视频用H264基本不会踩坑:
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); - 一定要设置合法的输出文件路径,而且得确保APP有
WRITE_EXTERNAL_STORAGE权限(动态申请也不能忘):mMediaRecorder.setOutputFile(getOutputMediaFile().getAbsolutePath()); - 最后必须调用
mMediaRecorder.prepare(),而且要捕获这个方法的IO异常,很多时候准备失败的隐藏错误都在这里,比如文件路径无效、权限不足:try { mMediaRecorder.prepare(); } catch (IOException e) { Log.e(TAG, "Recorder准备失败: " + e.getMessage()); // 这里一定要处理,别直接跳过 }
权限检查不能走形式
你代码里的checkAvailabity()得真的把该要的权限都查一遍:Android 8.1需要动态申请RECORD_AUDIO、CAMERA、WRITE_EXTERNAL_STORAGE这三个权限,缺一个都可能导致录制失败。而且就算之前申请过,也要在启动录制前再确认一遍权限状态,避免用户中途撤销了权限。
相机资源别冲突
看你代码里有预览相关的标记isPriviewVideoClicked,如果之前有开启相机预览,一定要在启动录制前先停止预览、释放相机资源。Android 8.1里相机和MediaRecorder的资源竞争特别容易导致状态错误,最好是录制前把相机预览停掉,等录制结束再重新初始化预览。
闪光灯操作要注意时机
你调用了flashOn(),别在MediaRecorder准备好之前就单独操作闪光灯,最好用MediaRecorder自带的闪光灯设置:
mMediaRecorder.setFlashMode(MediaRecorder.FlashMode.TORCH);
这样能避免和MediaRecorder的状态冲突,比单独调用相机闪光灯API更安全。
状态标记要靠谱
你的isRecordVideoClicked、isPriviewVideoClicked这些标记,要确保它们的状态是正确的,比如启动录制前,没有其他操作占用了MediaRecorder或者相机资源,别因为标记逻辑出错导致重复初始化或者状态混乱。
最后给个调试小技巧:在prepareRecorder()的每一步配置后都打个日志,看看哪一步出了问题,比如输出格式设置后打印一下,编码器设置后也打印,这样能快速定位到配置环节的问题。
内容的提问来源于stack exchange,提问作者Android dev

