Java 当记录器应该停止时,应用程序崩溃

Java 当记录器应该停止时,应用程序崩溃,java,android,eclipse,Java,Android,Eclipse,我在google play上上传了一个应用程序 它还没有在很多设备上测试过,所以错误很常见。今天一位用户给我发了一条消息,说如果togglebutton被打开,而按钮只是被按下,而不是被按住,应用程序就会崩溃 这是他发给我的日志文件: E/MessageQueue-JNI(31135): java.lang.RuntimeException: stop failed. E/MessageQueue-JNI(31135): at android.media.MediaRecorder.stop(N

我在google play上上传了一个应用程序

它还没有在很多设备上测试过,所以错误很常见。今天一位用户给我发了一条消息,说如果togglebutton被打开,而按钮只是被按下,而不是被按住,应用程序就会崩溃

这是他发给我的日志文件:

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打开时才会发生。如果我触摸并按住按钮,它工作正常,但如果我只触摸它片刻,它就会崩溃。我使用的是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完全调用之前,StopRecording已经调用了,所以它崩溃了,因为startRecording甚至还没有完全初始化。如果是这样的话,我该怎么解决呢?如果不是这样的话,那怎么了?为什么这样的错误会出现在另一部手机上而不是我的手机上?

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

public void stop()

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

因此,您可以在
stop
呼叫中添加一个try-catch

if (null != recorder) {
   try{     
      recorder.stop();
   }catch(RuntimeException ex){
   //Ignore
   }
   ...
}

需要明确的是:这里的想法是应用程序记录按钮按下的时间有多长?@chrylis是的,没错。你可以下载这个应用程序,自己看看它到底应该如何工作,但是是的,如果开关按钮打开,它的工作原理和你描述的完全一样。真的吗?如果MediaRecorder没有收到任何数据,它会故意抛出一个裸
运行时异常。如果用户只触摸按钮片刻,则MediaRecording开始录制,但没有收到任何输入(因为它立即停止),因此出现
RuntimeException
感谢您的回答,我将尝试此操作,将更新的apk发送给此用户,看看它是否有效。我会让你知道,并接受你的答案,如果它的工作:)这花了一段时间,以获得回应,但似乎问题已经解决。该应用程序现在显示的不是崩溃,而是干杯。谢谢:)@Matthew我很高兴这对你有帮助