Search code examples
javaandroidmediarecorder

Android Studio. App crashes when only clicking button/imageview with onTouchListener


Hello I am developing an app that could track every users location, as part of this, the app can record voice message before sending it to mysql server. The app is good and running when the user holding the record button/imageview. But crashes when some users only clciking the button/imageview and not holding it to record their voice.

How to prevent this app crashes? how can I handle if the user only click the button and give warning but not crashing the app. Thank you

mFileName = Environment.getExternalStorageDirectory() + "/"+user_id+".3gp";
        recordBtn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {


                if(checkPermissionFromDevice()){

                    if(event.getAction() == MotionEvent.ACTION_DOWN){
                        startRecording();
                        recordLabel.setText("Recording Started...");
                    }else if(event.getAction() == MotionEvent.ACTION_UP){
                        stopRecording();
                        recordLabel.setText("Recording Stoped...");
                    }

                }
                else{
                    requestPermission();
                }
                return false;
            }
        });


    }

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: www.teamruby.com.capstoneproject, PID: 3679
    java.lang.RuntimeException: stop failed.
        at android.media.MediaRecorder.stop(Native Method)
        at www.teamruby.com.capstoneproject.INeedHelp.stopRecording(INeedHelp.java:383)
        at www.teamruby.com.capstoneproject.INeedHelp.access$300(INeedHelp.java:69)
        at www.teamruby.com.capstoneproject.INeedHelp$3.onTouch(INeedHelp.java:194)
        at android.view.View.dispatchTouchEvent(View.java:9290)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
        at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
        at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
        at android.view.View.dispatchPointerEvent(View.java:9514)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(Me

Solution

  • I think the error actually happens because the user instantly starts recording and stops too soon so maybe the the media recorder is stopping before it even started because it says MediaRecorder.stop fails. An simple solution for now is to wrap it in a try catch and if an error occurs show your warning toast like this:

    try {
        stopRecording();
    } catch(RunTimeException e) {
        e.printstack();
        //your toast
    }