alhazmy13 / MediaPicker

Media Picker is an Android Libary that lets you to select multiple images or video
alhazmy13.net
Apache License 2.0
268 stars 86 forks source link

App crashes if user presses back button when ImageActivity is gone #102

Closed prfarlow1 closed 4 years ago

prfarlow1 commented 4 years ago

Example Code that causes crash:

    private void showAvatarImagePicker() {
        ImagePicker.Builder builder = new ImagePicker.Builder(getActivity())
                .mode(ImagePicker.Mode.CAMERA_AND_GALLERY)
                .compressLevel(ImagePicker.ComperesLevel.NONE)
                .directory(ImagePicker.Directory.DEFAULT)
                .extension(ImagePicker.Extension.JPG)
                .scale(344, 344)
                .allowMultipleImages(false)
                .enableDebuggingMode(true);
        imagePickDisposable.dispose();
        imagePickDisposable = new ImagePickerHelper(builder).getObservable()
                .subscribe(data -> {
                    updateUiWithImage(date)
                }, throwable -> logger.error("error while picking an image", throwable));
    }

Crash log:

Fatal Exception: io.reactivex.exceptions.UndeliverableException: java.lang.Throwable: user did not select any image
       at io.reactivex.plugins.RxJavaPlugins.onError + 367(RxJavaPlugins.java:367)
       at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError + 74(ObservableCreate.java:74)
       at net.alhazmy13.mediapicker.rxjava.image.ImagePickerReceiver.onReceive + 35(ImagePickerReceiver.java:35)
       at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0 + 1487(LoadedApk.java:1487)
       at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run + 2(-.java:2)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 216(Looper.java:216)
       at android.app.ActivityThread.main + 7263(ActivityThread.java:7263)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 494(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main + 975(ZygoteInit.java:975)

Caused by java.lang.Throwable: user did not select any image
       at net.alhazmy13.mediapicker.rxjava.image.ImagePickerReceiver.onReceive + 35(ImagePickerReceiver.java:35)
       at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0 + 1487(LoadedApk.java:1487)
       at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run + 2(-.java:2)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 216(Looper.java:216)
       at android.app.ActivityThread.main + 7263(ActivityThread.java:7263)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 494(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main + 975(ZygoteInit.java:975)

Steps to reproduce: (1) In developers options on phone, enable the 'Don't keep activities' flag (2) Launch app on phone with ImagePickerHelper code above (3) Select either Gallery or Camera when prompted for image source (4) Press the back button (5) Observe app crashes

Fix: In ImagePickerObservable, add this line in the subscribe method:

emitter.setDisposable(Disposables.fromAction(() -> dispose()));