在onLongClickListener中调用MediaRecorder.start时在android.media.MediaRecorder.start上的java.lang.IllegalStateException

The*_*mad 6 android illegalstateexception mediarecorder android-mediarecorder

MediaRecorder当我按住按钮时,我想开始录制语音消息.IllegalStateException当我试图开始录制时,我正在尝试onLongClickListener.

我在堆栈跟踪中记录的错误是在第219行: recorder.start()

为什么会这样?

btnSendVoice.setOnLongClickListener(new OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            isVoiceButtonHeld = true;
            startRecording();
            return false;
        }
    });

    btnSendVoice.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            view.onTouchEvent(event);

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (isVoiceButtonHeld) {
                    isVoiceButtonHeld = false;
                    stopRecording();
                }
            }

            return false;
        }
    });

private void startRecording() {
    Toast.makeText(getActivity(), "Recording Message", Toast.LENGTH_SHORT).show();

    filename = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiotest.3gp";

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(filename);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    try { recorder.prepare(); } 
    catch (IOException e) { Log.e("MediaRecorder", "prepare() failed"); }
    recorder.start();
}

private void stopRecording() {
    Toast.makeText(getActivity(), "Recording Finished", Toast.LENGTH_SHORT).show();

    recorder.stop();
    recorder.release();
    recorder = null;
}

@Override
public void onPause() {
    super.onPause();

    // Free up resources from MediaRecorder when leaving Fragment
    if (recorder != null) {
        recorder.release();
        recorder = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

logcat的

07-15 16:24:32.256: E/MediaRecorder(4227): start failed: -38
07-15 16:24:32.256: D/AndroidRuntime(4227): Shutting down VM
07-15 16:24:32.256: W/dalvikvm(4227): threadid=1: thread exiting with uncaught exception (group=0x41551ba8)
07-15 16:24:32.406: E/AndroidRuntime(4227): FATAL EXCEPTION: main
07-15 16:24:32.406: E/AndroidRuntime(4227): Process: com.walintukai.lfdate, PID: 4227
07-15 16:24:32.406: E/AndroidRuntime(4227): java.lang.IllegalStateException
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.media.MediaRecorder.start(Native Method)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at com.walintukai.lfdate.ChatFragment.startRecording(ChatFragment.java:219)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at com.walintukai.lfdate.ChatFragment.access$4(ChatFragment.java:206)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at com.walintukai.lfdate.ChatFragment$3.onLongClick(ChatFragment.java:132)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.view.View.performLongClick(View.java:4474)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.view.View$CheckForLongPress.run(View.java:18418)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.os.Handler.handleCallback(Handler.java:733)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.os.Looper.loop(Looper.java:136)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at android.app.ActivityThread.main(ActivityThread.java:5050)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at java.lang.reflect.Method.invokeNative(Native Method)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at java.lang.reflect.Method.invoke(Method.java:515)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
07-15 16:24:32.406: E/AndroidRuntime(4227):     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

joa*_*t4u 2

您忘记添加<uses-permission android:name="android.permission.RECORD_AUDIO" />在文件中录制音频的权限Manifest.xml

编辑:您onTouchListener正在干扰onLongClickListener并可能MediaRecorder在初始化之后和启动之前停止您的操作,甚至在记录器为空时停止它。这给了你的起源Exception

请注意,如果您注释该行view.onTouchEvent(event);,它会开始录制,但从那一刻起,根据用户操作,它会出现不可预测的行为。

请注意,这种情况Event.ACTION_CANCEL有可能发生在您的场景中,必须考虑到这一点才能recorder阻止您的操作。

在调用之前请务必检查您的值是否recorder不为空stop()