Java 当记录器应该停止时,应用程序崩溃
我在google play上上传了一个应用程序 它还没有在很多设备上测试过,所以错误很常见。今天一位用户给我发了一条消息,说如果togglebutton被打开,而按钮只是被按下,而不是被按住,应用程序就会崩溃 这是他发给我的日志文件: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
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我很高兴这对你有帮助