android - Android MediaRecorder 在某些设备上不起作用
问题描述
我在后台服务中运行媒体记录器,该服务在三星 6.0 及更高版本的设备中运行完美,但在较低的设备中无法运行。抛出以下异常
stop called in an invalid state: 4
FATAL EXCEPTION: main
Process: com.shoaibnwar.crighter, PID: 28547
java.lang.IllegalStateException
at android.media.MediaRecorder._stop(Native Method)
at android.media.MediaRecorder.stop(MediaRecorder.java:946)
at com.shoaibnwar.crighter.Services.RecordingAudio.stopRecording(RecordingAudio.java:114)
at com.shoaibnwar.crighter.Services.RecordingAudio.access$000(RecordingAudio.java:24)
at com.shoaibnwar.crighter.Services.RecordingAudio$1.run(RecordingAudio.java:69)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:7007)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
这是我的开始录制代码
private void startRecording(File file) {
if (mediaRecorder != null) {
mediaRecorder.reset();
mediaRecorder.release();
}
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
// mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
//mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
/* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
mediaRecorder.setAudioEncodingBitRate(48000);
} else {
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioEncodingBitRate(64000);
}
mediaRecorder.setAudioSamplingRate(16000);*/
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
Log.e("giftlist", "io problems while preparing [" +
file.getAbsolutePath() + "]: " + e.getMessage());
}
}
和停止录音功能是
private void stopRecording() {
if (mediaRecorder != null) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
}
我正在设置文件路径,如下所示
private File getOutputFile() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US);
return new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()
+File.separator
+Environment.DIRECTORY_MUSIC
+File.separator
+ "/CRighterVoice/RECORDING_"
+ dateFormat.format(new Date())
+ ".m4a");
}
解决方案
我有同样的问题。我从搜索中得到的是基本问题是
mediaRecorder.setAudioSource()
因为您正在使用AudioSource.MIC
所以某些设备不支持这个。
在这里准备录音文档时,我们可以使用一些录音源,但遗憾的是,在每个不同的设备中,它可能会有所不同。
对于某些设备,VOICE_CALL
可以工作,而对于某些,其他。但至少我们可以尝试。所以在我的例子中,运行低于 6 的 Android 设备运行VOICE_CALL
良好。
另一个原因是有时准备需要一些时间才能完成。我在这里找到了这个示例项目,由于某种原因,它在 UI 线程上休眠了 2 秒,在mediaRecorder
. 它工作正常。
以下是您看到的成功录制通话的项目的链接,并检查所有设备中媒体源的更改方式。
希望这能解决您的问题。
推荐阅读
- jenkins - 从 Jenkinsfile 中提取参数
- angular - 如何处理 API 服务中的 HTTP 错误并仅在成功的情况下通过 Observable 返回响应?
- spring - Whitelabel 错误页面只是在 URL 上输入?
- android - 类型'int'不是Dart中类型'String'错误的子类型
- php - 如何在 GraphQL 中返回自定义错误
- php - Laravel 5.6 - “试图获取非对象的属性”
- javascript - 停止打开打印对话框
- r - R - 执行用户定义函数时出错
- google-apps-script - 无法在 GAS 编辑器上切换谷歌云项目
- mathjax - 合成师:MathJax