当录音机停止时应用程序崩溃

时间:2013-08-25 14:36:28

标签: java android eclipse

我在google play上传了一个应用。 This is the link.

它尚未在许多设备上进行测试,因此错误很常见。一位用户今天向我发出消息说,如果打开togglebutton并且仅按下按钮而不按住按钮,应用程序将崩溃。

这是他发给我的logcat文件:

E/MessageQueue-JNI(31135): java.lang.RuntimeException: stop failed.
E/MessageQueue-JNI(31135): at android.media.MediaRecorder.stop(Native Method)
E/MessageQueue-JNI(31135): at com.whizzappseasyvoicenotepad.MainActivity.stopRecording(MainActivity.java:183)

引用:

  

应用程序并不总是崩溃。有时确实如此,有时却没有。它仅在togglebutton为ON时发生。如果我触摸并按住按钮它工作正常,但如果我只触摸它一会儿它会崩溃。我正在使用Xperia S 4.1.2

我在手机上尝试了这个,我只触摸按钮而不是按住它并且它工作得非常好,我不知道为什么这会发生在他的手机上。

这是onTouchListener的代码:

recBtn.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    startRecording();
                }
                else if (event.getAction() == MotionEvent.ACTION_UP)
                {
                    stopRecording();
                    nameAlert();
                }
            return true;
            }
        });

并且logcat说调用stopRecording时会出现问题,所以这里是stopRecording方法:

public void stopRecording() {
    final ImageButton recBtn = (ImageButton) findViewById(com.whizzappseasyvoicenotepad.R.id.recButton);
    final ToggleButton tBtn = (ToggleButton) findViewById(R.id.tBtn1);
    if (null != recorder) {
        recorder.stop();
        recorder.reset();
        recorder.release(); 
        recorder = null;

        recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
        stopTimer();
        tBtn.setEnabled(true);
    }
}

我猜测问题是他只触摸按钮一会儿,所以在完全调用startRecording之前,已经调用了stopRecoring,因此它崩溃了因为startRecording甚至还没有完全启动。如果是这样的话,我该如何解决?如果不是这样,那又怎么了?为什么这样的错误出现在另一部手机上而不是我的?

1 个答案:

答案 0 :(得分:15)

根据文档,这是正常行为:

  

public void stop ()

     

在API级别1中添加停止录制。在start()之后调用它。一旦   录制停止后,您必须再次进行配置,就好像它一样   刚刚建成。 请注意,故意发生RuntimeException   如果没有有效的音频/视频数据,则抛出应用程序   调用stop()时收到。如果调用stop(),则会发生这种情况   启动后立即()。失败让应用程序占用   相应的操作来清理输出文件(删除输出   例如,文件),因为输出文件没有正确构造   当发生这种情况时。

因此,您只需在stop电话

中添加try catch即可
if (null != recorder) {
   try{     
      recorder.stop();
   }catch(RuntimeException ex){
   //Ignore
   }
   ...
}