MediaRecorder启动失败报错-2147483648,通话录音APP崩溃求助
问题:通话录音APP启动录音时崩溃,提示
MediaRecorder start failed: -2147483648 场景与核心代码
开发通话录音APP时使用MediaRecorder类,实体设备运行时触发崩溃,核心实现代码如下:
public void startRecord(){ String error = ""; mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setAudioEncodingBitRate(16); mediaRecorder.setAudioSamplingRate(44100); // 设置输出文件路径 String outputFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/test.mp3" ; System.out.println(outputFilePath); mediaRecorder.setOutputFile(outputFilePath); try { mediaRecorder.prepare(); mediaRecorder.start(); mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() { @Override public void onError(MediaRecorder mediaRecorder, int i, int i1) { System.out.println(mediaRecorder); System.out.println(i); System.out.println(i1); } }); error = "Start Record"; } catch (IOException e) { e.printStackTrace(); error = e.getMessage(); System.out.println(e.getMessage()); } }
错误日志
start failed: -2147483648 2023-10-15 23:05:21.957 1750-1750 AndroidRuntime com.team71.callrecording D Shutting down VM 2023-10-15 23:05:21.962 1750-1750 AndroidRuntime com.team71.callrecording E FATAL EXCEPTION: main Process: com.team71.callrecording, PID: 1750 java.lang.RuntimeException: start failed. at android.media.MediaRecorder.start(Native Method) at com.team71.callrecording.StartRecording.startRecord(StartRecording.java:34) at com.team71.callrecording.MainActivity$2.onClick(MainActivity.java:60) at android.view.View.performClick(View.java:7505) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1213) at android.view.View.performClickInternal(View.java:7477) at android.view.View.access$3600(View.java:824) at android.view.View$PerformClick.run(View.java:28652) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:257) at android.app.ActivityThread.main(ActivityThread.java:8218) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016)
解决方案
1. 权限检查与适配
- 确保已申请并授予以下权限,Android 6.0+需动态申请:
RECORD_AUDIO:基础录音权限READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE(Android 13+用READ_MEDIA_AUDIO替代):文件读写权限READ_PHONE_STATE:部分机型获取通话音频源的必要权限
- 注意:
VOICE_CALL音频源在部分Android版本或国产ROM中被厂商限制,若无法使用,可降级为VOICE_COMMUNICATION或MIC作为替代方案。
2. 修复音频参数不兼容问题
- 格式与后缀不匹配:输出格式设为
MPEG_4,但文件后缀是.mp3,将文件名改为test.m4a,或把输出格式改为MediaRecorder.OutputFormat.THREE_GPP(对应.3gp) - 比特率设置错误:
setAudioEncodingBitRate(16)数值过小,AMR_NB标准比特率为12200左右,建议改为128000(通用音频比特率) - 采样率与编码器冲突:AMR_NB不支持44100Hz采样率,改为
8000Hz(AMR_NB标准采样率);若需保留44100Hz,将编码器改为MediaRecorder.AudioEncoder.AAC
3. 调整代码逻辑
- 提前设置错误监听器:当前在
start()后设置监听器,无法捕获启动时的错误,需移至prepare()之前:mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() { @Override public void onError(MediaRecorder mediaRecorder, int i, int i1) { Log.e("RecorderError", "Error code: " + i + ", extra: " + i1); } }); mediaRecorder.prepare(); mediaRecorder.start(); - 规范文件路径处理:避免直接拼接字符串,用
File类确保路径有效性:File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "test.m4a"); mediaRecorder.setOutputFile(outputFile.getAbsolutePath());
4. 适配系统与机型限制
- Android 10及以上版本,
VOICE_CALL音频源可能被系统限制,可尝试使用MediaProjectionAPI(需用户授权屏幕录制权限,可间接捕获通话音频) - 部分国产ROM(如小米、华为)需在系统设置中单独开启APP的通话录音权限
内容的提问来源于stack exchange,提问作者Rumion Tomal
相关产品推荐
相关产品推荐

