【问题标题】:IllegalStateException on MediaRecorder.start()MediaRecorder.start() 上的 IllegalStateException
【发布时间】:2020-01-31 19:41:10
【问题描述】:

早上好!

我在制作应用时遇到了一个奇怪的问题。一些用户在 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" />

感谢您的帮助。

【问题讨论】:

  • 你能在它抛出 IllegalStateException 时添加你的错误日志吗?
  • @Jaymin 我添加了它
  • 是你的申请录音电话吗?? @DenisPinna
  • 停止后是重置还是释放录音机?
  • 不,是用户在应用中点击的按钮实时记录。

标签: android illegalstateexception android-mediarecorder


【解决方案1】:

感谢大家的帮助。我认为我的问题是电话正在通话(或其他通信应用程序)。

为了防止这种情况,我之前添加了此检查

public static boolean isMicrophoneAvailable() {
        AudioManager audioManager = (AudioManager) MyApp.getAppContext().getSystemService(Context.AUDIO_SERVICE);
        return audioManager.getMode() == MODE_NORMAL;
    }

【讨论】:

    【解决方案2】:

    我通常使用的用例是,我创建媒体记录器的实例并在用户按下按钮时启动。一旦录制完成并且用户按下停止按钮,我就会释放媒体记录器。

    这是我的一段代码:

    private fun startRecording() {
    
            mRecorder = MediaRecorder()
    
            try {
                mRecorder.prepare()
                mRecorder.start()
            } catch (e: IOException) {
                e.printStackTrace()
            }   
        }
    

    当用户按下停止按钮时,调用 stopRecording 方法。

     private fun stopRecording() {
            mRecorder.stop()
            mRecorder.release()
    
        }
    

    你可以在你的应用程序中应用这个。

    注意:代码在 Kotlin 中。

    【讨论】:

    • 嗨@Jaymin,你确定它可能来自这个,prepare() 我应该默认同步吗?你已经有案子了吗?
    • 是的,它可以正常工作。我会默认同步。你只需要替换代码并检查。
    • 我认为这不是我的问题,它是 MediaRecorder 而不是 MediaPlayer,这个没有这样的方法。
    • @DenisPinna,我已经更新了代码。请看一看。
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2019-11-24
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多