Search code examples
androidexceptionmediarecorderfailed-installation

Android Kotlin - caught exception still crashes program


code:

  viewModel.saveLayer.observeNonNull(this) {
        Log.i(TAG, "save layer")
        try {
            // starting to record takes longer than stopping. so, if timed right, a recorder could be stopped
            // before started.
            with(mediaRecorder) {
                stop()
                reset()
            }
            sharedPrefs.updateNumSavedLayers(it)
            viewModel.updateNumSavedLayers(it)
        } catch(e: Exception) {
            Log.e(TAG,"could not save layer", e)
        }
    }

The crash is still thrown. See below:

2019-02-20 19:45:22.514 22435-22435/com.xxx.xxx E/PedalApp: could not save layer java.lang.RuntimeException: stop failed. at android.media.MediaRecorder.stop(Native Method) at com.androidchekhov.looperpedal.PedalActivity$onCreate$6.invoke(PedalActivity.kt:92) at com.androidchekhov.looperpedal.PedalActivity$onCreate$6.invoke(PedalActivity.kt:17) at com.androidchekhov.looperpedal.ExtensionsKt$observeNonNull$1.onChanged(Extensions.kt:9) at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109) at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126) at android.arch.lifecycle.LiveData.setValue(LiveData.java:282) at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33) at com.xxx.xxx.PedalViewModel.pedalClick(PedalViewModel.kt:47) at com.androidchekhov.looperpedal.PedalActivity$onCreate$11.invoke(PedalActivity.kt:137) at com.androidchekhov.looperpedal.PedalActivity$onCreate$11.invoke(PedalActivity.kt:17) at com.androidchekhov.looperpedal.OnPedalTouchListener.handleClick(OnPedalListener.kt:80) at com.androidchekhov.looperpedal.OnPedalTouchListener.onTouch(OnPedalListener.kt:41) at android.view.View.dispatchTouchEvent(View.java:11775) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:448) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1834) at android.app.Activity.dispatchTouchEvent(Activity.java:3312) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:410) at android.view.View.dispatchPointerEvent(View.java:12018) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4829) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4643) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4181) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4234) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4200) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4327) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4208) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4384) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4181) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4234) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4200) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4208) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4181) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6755) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6694) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6655) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6858) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193 at android.os.MessageQueue.nativePollOnce(Native Method)


Solution

  • not sure if I misunderstood your problem but the following line indicates that the exception you are seeing is printed by your own code:

    Log.e(TAG,"could not save layer", e)

    If you provide the exception to the Log.e command, it is printed alongside your message (see documentation):

    Send a ERROR log message and log the exception.
    

    Please note that your message "could not save layer" is shown as well. So you just see a printed stack trace, but the exception is correctly caught and therefore does not crash your app. Maybe follow-up problems are responsible for the crash.

    Please (1) provide more context on the app and (2) check if there are other crash indicators in, e.g., logcat that you could share. Based on the information you provided, I assume there is another crash that actually tears down the app.