IllegalStateException на MediaRecorder.start () - PullRequest
0 голосов
/ 31 января 2020

Утро!

У меня странная проблема с рабочим приложением. Некоторые пользователи получают IllegalStateException при запуске MediaRecorder. Я не могу воспроизвести проблему на нескольких принадлежащих мне устройствах или даже на эмуляторе. Эта ошибка возникает на разных версиях и устройствах (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" />

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Спасибо, ребята, за помощь. Я думаю, что проблема в моем случае состояла в том, что телефон находился в режиме вызова (или другого приложения связи).

Чтобы предотвратить это, я добавил эту проверку перед

public static boolean isMicrophoneAvailable() {
        AudioManager audioManager = (AudioManager) MyApp.getAppContext().getSystemService(Context.AUDIO_SERVICE);
        return audioManager.getMode() == MODE_NORMAL;
    }
0 голосов
/ 31 января 2020

Я обычно использую вариант использования: я создаю экземпляр медиа-рекордера и запускаю, когда пользователь нажимает кнопку. как только запись закончена, и пользователь нажимает кнопку остановки, я отпускаю медиа-рекордер.

Вот мой кусок кода:

private fun startRecording() {

        mRecorder = MediaRecorder()

        try {
            mRecorder.prepare()
            mRecorder.start()
        } catch (e: IOException) {
            e.printStackTrace()
        }   
    }

Когда пользователь нажимает кнопку остановки, затем вызывать метод stopRecording.

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

    }

То же самое, что вы можете применить в вашем приложении.

Примечание: код в Kotlin.

...