【问题标题】:java.lang.IllegalStateException at android.media.MediaRecorder.start when calling MediaRecorder.start in onLongClickListener在 onLongClickListener 中调用 MediaRecorder.start 时,android.media.MediaRecorder.start 处的 java.lang.IllegalStateException
【发布时间】:2014-09-06 08:02:36
【问题描述】:

当我按住一个按钮时,我想用MediaRecorder 开始录制语音消息。尝试在 onLongClickListener 中开始录制时,我收到了 IllegalStateException

堆栈跟踪中指出的我收到的错误位于第 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;
    }
}

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)

【问题讨论】:

    标签: android illegalstateexception mediarecorder android-mediarecorder


    【解决方案1】:

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

    编辑:您的onTouchListener 正在干扰onLongClickListener,并且可能会在您的MediaRecorder 初始化后立即停止,并且在记录器为空时启动甚至停止它。这为您的Exception 提供了来源。

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

    请注意,Event.ACTION_CANCEL 可能会发生在您的场景中,并且必须考虑到才能让您的recorder 停止。

    在调用stop() 之前,请确保检查您的recorder 是否不为空。

    【讨论】:

    • 我已经把它放在那里了。当我使用常规按钮时,我可以更早地使用记录、停止和播放功能。当我将记录函数放在onLongClickListener 中时出现了这个问题。
    • 第一次长按还是第二次长按会崩溃吗?
    • 第一次长按就崩溃了。
    • 另外,为了让你的实现更加健壮,在调用stop()之前检查mediarecorder是否不为空。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多