6

我在 google play 上上传了一个应用程序。这是链接。

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

这是他发给我的 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)

引用:

应用程序并不总是崩溃。有时会,有时不会。它仅在切换按钮打开时发生。如果我触摸并按住按钮,它可以正常工作,但如果我只触摸它片刻,它就会崩溃。我正在使用 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 甚至还没有完全启动。如果是这种情况,我该如何解决?如果不是这样,那有什么问题呢?为什么这样的错误会出现在另一部手机上而不是我的手机上?

4

1 回答 1

17

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

public void stop ()

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

所以你可以在你的stop电话中添加一个 try catch

if (null != recorder) {
   try{     
      recorder.stop();
   }catch(RuntimeException ex){
   //Ignore
   }
   ...
}
于 2013-08-25T14:50:55.237 回答