早上!
我在生产应用中遇到了一个奇怪的问题。某些用户在MediaRecorder启动时收到IllegalStateException。我无法在自己拥有的少数设备上甚至在仿真器上重现该问题。此错误发生在不同的版本和设备(Android 5至10和各种设备)上,并且发生多次。
这里是代码
if (mRecorder == null) {
mRecorder = new MediaRecorder();
} else {
try {
mRecorder.stop();
} catch (Exception e) {}
}
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioSamplingRate(44100);
mRecorder.setAudioEncodingBitRate(128000);
mRecorder.setOutputFile(mSoundFile.getAbsolutePath());
mRecorder.setAudioChannels(1);
mRecorder.setMaxDuration(mMaxDurationInMs);
mRecorder.prepare();
mRecorder.start();
和堆栈跟踪
java.lang.IllegalStateException: null
at android.media.MediaRecorder.native_start(MediaRecorder.java)
at android.media.MediaRecorder.start(MediaRecorder.java:1603)
at de.boxine.someapp.util.media.VoiceRecorder.start(VoiceRecorder.java:115)
at de.boxine.someapp.recording.audio.RecordAudioPresenter.startRecording(RecordAudioPresenter.java:186)
at de.boxine.someapp.recording.audio.RecordAudioPresenter.startRecordingByAvailableSource(RecordAudioPresenter.java:204)
at de.boxine.someapp.recording.audio.RecordAudioPresenter.access$500(RecordAudioPresenter.java:27)
at de.boxine.someapp.recording.audio.RecordAudioPresenter$2.onPermissionGranted(RecordAudioPresenter.java:116)
at de.boxine.someapp.mvp.AbstractPresenter.checkPermissionBeforeRun(AbstractPresenter.java:67)
at de.boxine.someapp.recording.audio.RecordAudioPresenter.onRecordButtonClicked(RecordAudioPresenter.java:108)
at de.boxine.someapp.recording.audio.RecordAudioFragment.lambda$onCreateView$0$RecordAudioFragment(RecordAudioFragment.java:112)
at de.boxine.someapp.recording.audio.-$$Lambda$RecordAudioFragment$9H7EZrHdPKO0BFbM_UTVYf_SFBU.onClick
at android.view.View.performClick(View.java:6659)
at android.view.View.performClickInternal(View.java:6631)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26187)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
清单中也有这些权限(我在最近的Android版本上实时要求它们)
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
感谢您的帮助。
我通常使用的用例是,创建媒体记录器的实例,并在用户按下按钮时启动。录制完成后,用户按下“停止”按钮,然后释放媒体记录器。
这是我的代码:
private fun startRecording() {
mRecorder = MediaRecorder()
try {
mRecorder.prepare()
mRecorder.start()
} catch (e: IOException) {
e.printStackTrace()
}
}
[当用户按下停止按钮,然后调用stopRecording方法时。
private fun stopRecording() {
mRecorder.stop()
mRecorder.release()
}
您可以在应用程序中应用的相同。
注意:代码在Kotlin中。