Giter Site home page Giter Site logo

rximagepicker's Introduction

RxImagePicker

An easy way to get image from Gallery or Camera with request runtime permission on Android M using RxJava2

Setup

To use this library your minSdkVersion must be >= 16.

In your build.gradle :

dependencies {
    implementation 'com.mlsdev.rximagepicker:library:2.2.1'    
}

Example

RxImagePicker.with(supportFragmentManager).requestImage(Sources.CAMERA).subscribe {
            //Get image by uri using one of image loading libraries. I use Glide in sample app.
        }

Request image from gallery :

RxImagePicker.with(supportFragmentManager).requestImage(Sources.GALLERY).subscribe {
            
        }

Request image from documents :

RxImagePicker.with(supportFragmentManager).requestImage(Sources.DOCUMENTS).subscribe {
            
        }

Use android chooser to get image :

RxImagePicker.with(supportFragmentManager).requestImage(Sources.CHOOSER, "Chooser title").subscribe {
            
        }

Request multiple images on Android Api level 18+ :

RxImagePicker.with(supportFragmentManager).requestMultipleImages().subscribe {
            //Get images by uris.
        }

Using converters

RxImagePicker.with(context).requestImage(Sources.GALLERY)
    .flatMap(new Function<Uri, ObservableSource<Bitmap>>() {
                    @Override
                    public ObservableSource<Bitmap> apply(@NonNull Uri uri) throws Exception {
                        return RxImageConverters.uriToBitmap(getContext(), uri);
                    }
                }).subscribe(new Consumer<Bitmap>() {
                    @Override
                    public void accept(@NonNull Bitmap bitmap) throws Exception {
                        // Do something with Bitmap
                    }
                });
RxImagePicker.with(context).requestImage(Sources.GALLERY)
    .flatMap(new Function<Uri, ObservableSource<File>>() {
                    @Override
                    public ObservableSource<File> apply(@NonNull Uri uri) throws Exception {
                        return RxImageConverters.uriToFile(getContext(), uri, new File("YOUR FILE"));
                    }
                }).subscribe(new Consumer<File>() {
                    @Override
                    public void accept(@NonNull File file) throws Exception {
                        // Do something with your file copy
                    }
                });

Sample App

Authors

License

RxImagePicker is released under the MIT license. See LICENSE for details.

About MLSDev

MLSDev.com

RxImagePicker is maintained by MLSDev, Inc. We specialize in providing all-in-one solution in mobile and web development. Our team follows Lean principles and works according to agile methodologies to deliver the best results reducing the budget for development and its timeline.

Find out more here and don't hesitate to contact us!

rximagepicker's People

Contributors

frederikos avatar hamen avatar osipovaleks avatar s0nerik avatar saadfarooq avatar slavafir avatar stuartsoft avatar timusus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rximagepicker's Issues

Not working when calling from a fragment

When i am calling RxImagePicker from a fragment application is closing after taking image or picking from gallery.
Is there any way to work it with Fragment ?

Camera OK button not functioning

It happens in some devices I guess..
When I take a picture with camera and clicked OK, the camera activity doesn't close. But the picture has been saved, I checked it in the gallery app.
This is my code..it's a simple code actually..

RxImagePicker.with(getContext()).requestImage(Sources.CAMERA).subscribe(new Consumer<Uri>() { @Override public void accept(@NonNull Uri uri) throws Exception { Glide.with(UserProfileFragment.this) .load(uri) .into(binding.photoLayout.profilePictureIv); } });

Btw, it happens on version 1.3.1 and 2.0.2. It's not happening in 1.1.7.
I can't use the old version because of FileUriExposedException in Android N.

Thank you.

Unable to start activity

On some devices (as Xiaomi, samsung ...), i have this crash

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mlsdev.rximagepicker.HiddenActivity}: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.OPEN_DOCUMENT typ=image/* flg=0x41 (has extras) } at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526) at android.app.ActivityThread.access$800(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5549) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) Caused by android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.OPEN_DOCUMENT typ=image/* flg=0x41 (has extras) } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1776) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496) at android.app.Activity.startActivityForResult(Activity.java:3778) at android.app.Activity.startActivityForResult(Activity.java:3739) at com.mlsdev.rximagepicker.HiddenActivity.handleIntent(HiddenActivity.java:105) at com.mlsdev.rximagepicker.HiddenActivity.onCreate(HiddenActivity.java:36) at android.app.Activity.performCreate(Activity.java:5975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526) at android.app.ActivityThread.access$800(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5549) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

VerifyError

Am getting this verify error in pre 6.0 devices

12-26 15:24:58.830 23811-23811/dt.wms.beeah W/dalvikvm: VFY: returning Ljava/lang/Object; (cl=0x0), declared Lrx/Observable; (cl=0x40f5a1b8)
12-26 15:24:58.830 23811-23811/dt.wms.beeah W/dalvikvm: VFY: rejecting opcode 0x11 at 0x0002
12-26 15:24:58.830 23811-23811/dt.wms.beeah W/dalvikvm: VFY: rejected Lcom/mlsdev/rximagepicker/RxImagePicker;.getActiveSubscription ()Lrx/Observable;
12-26 15:24:58.830 23811-23811/dt.wms.beeah W/dalvikvm: Verifier rejected class Lcom/mlsdev/rximagepicker/RxImagePicker;

RxImageConverters.uriToFullPath leads to ArrayIndexOutOfBoundsException

        RxImagePicker.with(context).requestImage(Sources.GALLERY)
                .flatMap { RxImageConverters.uriToFullPath(context, it) }
                .subscribe {
                    presenter.onPhotoPicked(it)
                }

I catch error while flatMap-ing result:

  java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
      at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:112)
      at android.os.Handler.handleCallback(Handler.java:615)
      at android.os.Handler.dispatchMessage(Handler.java:92)
      at android.os.Looper.loop(Looper.java:137)
      at android.app.ActivityThread.main(ActivityThread.java:4745)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:511)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
      at dalvik.system.NativeStart.main(Native Method)
   Caused by: rx.exceptions.OnErrorNotImplementedException: length=1; index=1
      at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:374)
      at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:371)
      at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44)
      at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157)
      at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
      at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
      at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:810)
      at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:571)
      at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:560)
      at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:844)
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:264)
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:207)
      at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4745) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 
   Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
      at com.mlsdev.rximagepicker.RxImageConverters$3.call(RxImageConverters.java:76)
      at com.mlsdev.rximagepicker.RxImageConverters$3.call(RxImageConverters.java:71)
      at rx.Observable.unsafeSubscribe(Observable.java:8460)
      at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
      at java.util.concurrent.FutureTask.run(FutureTask.java:137)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:150)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:264)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
      at java.lang.Thread.run(Thread.java:856)

There is code that throw this exception:


    public static Observable<String> uriToFullPath(final Context context, final Uri originalUri) {
        return Observable
            .create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    Cursor imageCursor = null;
                    try {
                        String imageId = originalUri.getLastPathSegment().split("%3A")[0].split(":")[1];
                        final String[] imageColumns = {MediaStore.Images.Media.DATA};

                        Uri uri;
                        if (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
                            uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                        } else {
                            uri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;
                        }

                        imageCursor = context.getContentResolver().query(uri, imageColumns, MediaStore.Images.Media._ID + "=" + imageId, null, null);
                        if (imageCursor != null && imageCursor.moveToFirst()) {
                            subscriber.onNext(imageCursor.getString(imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)));
                            subscriber.onCompleted();
                        } else {
                            subscriber.onError(new Throwable("No image found"));
                        }
                    } catch (Exception e) {
                        subscriber.onError(e);
                    } finally {
                        if (imageCursor != null) {
                            imageCursor.close();
                        }
                    }
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());
    }

More precisely:
String imageId = originalUri.getLastPathSegment().split("%3A")[0].split(":")[1];

Tested on Android 4.1.1

Convert multiple Uri to File

how to use RxImageConverter in here from list of Uri to list of File

RxImagePicker.with(getContext()).requestMultipleImages().flatMap(new Function, ObservableSource>>() {
                @Override
                public ObservableSource> apply(@NonNull List uri) throws Exception {
                    return // how to use RxImageConverter in here?
                }
            }).subscribe(new Consumer>() {
                    @Override
                    public void accept(@NonNull List uris) throws Exception {
                        //Get images by uris.
                    }
                });

FileUriExposedException in Android N with Camera

Hi,

I have tried this library in my Nexus 6P with the preview of Android N, and it is working fine with Gallery but when selecting Camera source, it throws a FileUriExposedException.
This is the log:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com/com.mlsdev.rximagepicker.HiddenActivity}: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com/files/20160629_1123251566595922.jpg exposed beyond app through ClipData.Item.getUri()
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2631)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692)
                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:154)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6044)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                                                                         Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com/files/20160629_1123251566595922.jpg exposed beyond app through ClipData.Item.getUri()
                                                                            at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
                                                                            at android.net.Uri.checkFileUriExposed(Uri.java:2346)
                                                                            at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
                                                                            at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
                                                                            at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
                                                                            at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
                                                                            at android.app.Activity.startActivityForResult(Activity.java:4223)
                                                                            at android.app.Activity.startActivityForResult(Activity.java:4182)
                                                                            at com.mlsdev.rximagepicker.HiddenActivity.handleIntent(HiddenActivity.java:105)
                                                                            at com.mlsdev.rximagepicker.HiddenActivity.onCreate(HiddenActivity.java:36)
                                                                            at android.app.Activity.performCreate(Activity.java:6658)
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2584)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692) 
                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                            at android.os.Looper.loop(Looper.java:154) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6044) 
                                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

targetSdkVersion 24

The reason of this error is that file:// uri scheme no more supported because the security is exposed.
Here you have the google issue: link

How can we adjust the colour themes on the image picker

Guys, thanks for this awesome work. Made my work so much easier. One question though. How can I modify the colour themes on the picker so it fits nicely with my app?

Update: I see that the picker is system generated. Cool

Image picker fails to launch if Camera permission is not present in Manifest

The RxImagePicker library does not include <uses-permission android:name="android.permission.CAMERA"/> in the manifest. This is a good thing, as it means apps using this library don't automatically inherit that permission.

However, this also means that HiddenActivity.checkPermission() always fails, as we can't check for a permission that is not registered in the manifest.

I am able to reproduce this bug in the sample app on a Nexus 5X Running Android 7.0, a Nexus 6P running Android 7.0 and a Nexus 6P running Android 8.0.

The solution isn't simply to add the camera permission to the manifest. Some consumers of this library might only ever wish to retrieve images from the gallery.

Will follow up with a pull request shortly.

RxImagePicker with Camera crashes

Request

        RxImagePicker.with(fragmentManager!!).requestImage(Sources.CAMERA).subscribe {
            CropImage.activity(it).start(activity!!)

Description
No camera permission has been added to the manifest.

I am using kotlin with androidx Fragment

Error

  io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:content://media/external/images/media/130} (has extras) } from ProcessRecord{832fd42 28288:com.app.spectrum/u0a135} (pid=28288, uid=10135) with revoked permission android.permission.CAMERA
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
        at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:67)
        at io.reactivex.subjects.PublishSubject$PublishDisposable.onNext(PublishSubject.java:308)
        at io.reactivex.subjects.PublishSubject.onNext(PublishSubject.java:228)
        at com.mlsdev.rximagepicker.RxImagePicker.onAttach(RxImagePicker.kt:76)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2582)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:821)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1228)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1293)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2066)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1856)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1811)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1717)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:content://media/external/images/media/130} (has extras) } from ProcessRecord{832fd42 28288:com.app.spectrum/u0a135} (pid=28288, uid=10135) with revoked permission android.permission.CAMERA
        at android.os.Parcel.createException(Parcel.java:1942)
        at android.os.Parcel.readException(Parcel.java:1910)
        at android.os.Parcel.readException(Parcel.java:1860)
        at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3755)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1669)
        at android.app.Activity.startActivityForResult(Activity.java:4586)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
        at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234)
        at androidx.fragment.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:796)
        at androidx.fragment.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:933)
        at androidx.fragment.app.Fragment.startActivityForResult(Fragment.java:1210)
        at androidx.fragment.app.Fragment.startActivityForResult(Fragment.java:1198)
        at com.mlsdev.rximagepicker.RxImagePicker.pickImage(RxImagePicker.kt:161)
2019-07-02 16:53:28.157 28288-28288/com.app.spectrum E/AndroidRuntime:     at com.mlsdev.rximagepicker.RxImagePicker.access$pickImage(RxImagePicker.kt:23)
        at com.mlsdev.rximagepicker.RxImagePicker$requestPickImage$1.accept(RxImagePicker.kt:125)
        at com.mlsdev.rximagepicker.RxImagePicker$requestPickImage$1.accept(RxImagePicker.kt:23)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63)
        	... 20 more
     Caused by: android.os.RemoteException: Remote stack trace:
        at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1788)
        at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:717)
        at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
        at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
        at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)

Permission for using the Camera.

In your implementation only are checked the WRITE_EXTERNAL_STORAGE that allow getting images from the Gallery but when the image request is from Camera the application makes BUUUM :) ..
Exception:
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=org.cyanogenmod.snap/com.android.camera.PhotoCamera clip={text/uri-list U:content://media/external/images/media/4682} (has extras) }

requestImage doesn't call completion if user takes landscape photo in a portrait activity

My app is portrait only, and when I take a photo without rotating my phone (Galaxy S3), RxImagePicker works. However, if I take an image and while taking the picture I rotate my phone to take a landscape photo, the completion is never called in my app. I've also cross-posted the issue on SO (https://stackoverflow.com/questions/38000275/rximagepicker-not-calling-completion-if-orientation-changes-when-taking-image) and I was told that there's no way around this.

Is this true? What are all the other RxImagePicker users doing then? If not, how do I solve this issue?

Can not retrieve photo if taking a photo in landscape

Precondition
Remove android:configChanges line in AndroidManifest.xml of sample project.

Steps to reproduce

  1. Use portrait mode, Go to Main activity
  2. Click CAMERA floating action button
  3. Rotate the phone to landscape mode
  4. Take a photo and click Yes

Expected result:
4. The photo was attached into Main activity

Actual result:
4. No photo attached


Did some debug work, the order of method getting invoked is
Click YES in camera -> onImagePicked of MainActivity -> camera exiting... -> onCreate() of MainActivity.

RxImagePicker.with(this).getActiveSubscription().subscribe(this::onImagePicked) was hit in onCreate, but after that, onImagePicked() was not hit again.

java.io.FileNotFoundException: /tours: open failed: EROFS (Read-only file system)

When I use this method to convert uri to file, It throw me an exception, may be relevant to FileOutputStream:

RxImagePicker.with(context).requestImage(Sources.GALLERY)
    .flatMap(new Func1<Uri, Observable<File>>() {
             @Override
             public Observable<File> call(Uri uri) {
                 return RxImageConverters.uriToFile(context, uri, new File("filename.name");
             }
         })
         .subscribe(new Action1<File>() {
            @Override
            public void call(File file) {
                // Do something with your file copy
            }
         });

RxImageConverters.uriToFile method not using subscriber.onCompleted();

Hi team,
First thanks for this library,
I have doubt on RxImageConverters class

1.RxImageConverters.uriToFile onCreate not set subscriber.onCompleted();

Events are pushed to subscriber - onNext, onError and onCompleted methods on Subscriber are used to push the events onto it. As per Rx Design Guidelines, the events pushed from Observable should follow the below rules:
Zero, one or more than one calls to onNext
Zero or only one call to either of onCompleted or onError

from this source

can you explain ?

Thanks for Advance
Rajesh Rajendiran

Opening Sources.GALLERY opens documents photo not real gallery

When selecting Sources.GALLERY , it opens documents , how to do to open the gallery apps installed in the phone ?
something similar to this
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
context.startActivityForResult(intent, Constants.GALLERY_REQUEST);

java.lang.NoClassDefFoundError: rx.subjects.PublishSubject

I'm getting this error when trying to use on Android 4.1.2 on Samsung DUOS.
My code:
RxImagePicker.with(getApplicationContext()).requestImage(Sources.CAMERA)
.flatMap(new Func1<Uri, Observable>() {
@OverRide
public Observable call(Uri uri) {
return RxImageConverters.uriToBitmap(getApplicationContext(), uri);
}
})
.subscribe(new Action1() {
@OverRide
public void call(Bitmap bitmap) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bitmapData = bos.toByteArray();
encodedPhoto = Base64.encodeToString(bitmapData, Base64.DEFAULT);
imageView.setImageBitmap(bitmap);
}
});

LogCat:

06-01 14:00:43.191 27278-27278/br.com.deway.imeeting E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: rx.subjects.PublishSubject
at com.mlsdev.rximagepicker.RxImagePicker.requestImage(RxImagePicker.java:29)
at br.com.deway.imeeting.PortalColaborador.Login.Guardiao.GuardiaoActivity$4.onClick(GuardiaoActivity.java:321)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:934)
at android.widget.AdapterView.performItemClick(AdapterView.java:301)
at android.widget.AbsListView.performItemClick(AbsListView.java:1280)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3071)
at android.widget.AbsListView$1.run(AbsListView.java:3971)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4960)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)

App is crashing when i take picture from gallery

App is crashing when i take picture from gallery even the same issue occurring in your sample application . I guess ACTION_OPEN_DOCUMENT is having the issue . if i changed to ACTION_GET_CONTENT it works fine


java.lang.NullPointerException: onNext called with null. Null values are generally not allowed in 2.x operators and sources.
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at io.reactivex.subjects.PublishSubject.onNext(PublishSubject.java:180)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at com.mlsdev.rximagepicker.RxImagePicker.onImagePicked(RxImagePicker.java:52)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at com.mlsdev.rximagepicker.HiddenActivity.handleGalleryResult(HiddenActivity.java:97)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at com.mlsdev.rximagepicker.HiddenActivity.onActivityResult(HiddenActivity.java:74)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:6533)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:3935)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3982)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.ActivityThread.access$1500(ActivityThread.java:180)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:111)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.os.Looper.loop(Looper.java:207)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5811)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
12-18 11:37:05.690 20185-20185/parentapp.dt.dtcparent W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:768)

Delete pictures after uploading.

I am using RxImagePicker, I need to delete pictures after uploading. How can I find the exact path of the images? Currently, All the pictures are getting stored in PICTURE directory.

android.os.FileUriExposedException on API 24 (N)

https://code.google.com/p/android/issues/detail?id=203555

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{_/com.mlsdev.rximagepicker.HiddenActivity}: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/__/files/20160714_0818461830680327.jpg exposed beyond app through ClipData.Item.getUri()
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2631)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6044)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/_
**/files/20160714_0818461830680327.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
at android.app.Activity.startActivityForResult(Activity.java:4223)
at android.app.Activity.startActivityForResult(Activity.java:4182)
at com.mlsdev.rximagepicker.HiddenActivity.handleIntent(HiddenActivity.java:105)
at com.mlsdev.rximagepicker.HiddenActivity.onCreate(HiddenActivity.java:36)
at android.app.Activity.performCreate(Activity.java:6658)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2584)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6044)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Subscribe action is not fire if user check "Don't keep activity"

In standard implementation, both capture image with camera and pick image from gallery are working flawlessly

But one of my tester check "Don't keep activity" in android setting > Developer options to test what will happen, we found that

1.) the permission request flow seems to work fine
2.) but when take photo or choose image from gallery, the subscribe action is not fire.

How can we resolve this?

Failure delivering result ResultInfo

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131173, result=-1, data=null} to activity.
com.mlsdev.rximagepicker.RxImagePicker.onImagePicked + 242 (RxImagePicker.java:242)

  | com.mlsdev.rximagepicker.RxImagePicker.onActivityResult + 90 (RxImagePicker.java:90)
  | androidx.fragment.app.FragmentActivity.onActivityResult + 160 (FragmentActivity.java:160)

I started getting this error after updating the RxImagePicker to the latest version.

can you tell me how can I resolve this error?

No Activity found to handle Intent { act=android.media.action.IMAGE_CAPTURE}

I am getting Activity not found while taking pictures but this issue is appearing only with Samsung mode SM-J737V device.

this is the full stack trace of the issue:

Caused by android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 clip={text/uri-list U:content://media/external/images/media/717} (has extras) }
at android.app.Instrumentation.checkStartActivityResult + 2022(Instrumentation.java:2022)
at android.app.Instrumentation.execStartActivity + 1677(Instrumentation.java:1677)
at android.app.Activity.startActivityForResult + 4691(Activity.java:4691)
at androidx.fragment.app.FragmentActivity.startActivityForResult + 767(FragmentActivity.java:767)
at androidx.core.app.ActivityCompat.startActivityForResult + 234(ActivityCompat.java:234)
at androidx.fragment.app.FragmentActivity.onAttachFragment(FragmentActivity.java:8)
at androidx.fragment.app.FragmentActivity.startActivityFromFragment + 886(FragmentActivity.java:886)
at androidx.fragment.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment + 995(FragmentActivity.java:995)
at androidx.fragment.app.Fragment.startActivityForResult + 1103(Fragment.java:1103)
at androidx.fragment.app.Fragment.startActivityForResult + 1092(Fragment.java:1092)
at com.mlsdev.rximagepicker.RxImagePicker.pickImage + 161(RxImagePicker.java:161)
at com.mlsdev.rximagepicker.RxImagePicker.access$pickImage + 23(RxImagePicker.java:23)
at com.mlsdev.rximagepicker.RxImagePicker$requestPickImage$1.accept + 125(RxImagePicker.java:125)
at com.mlsdev.rximagepicker.RxImagePicker$requestPickImage$1.accept + 23(RxImagePicker.java:23)
at io.reactivex.internal.observers.LambdaObserver.onNext + 63(LambdaObserver.java:63)
at io.reactivex.subjects.PublishSubject$PublishDisposable.onNext + 311(PublishSubject.java:311)
at io.reactivex.subjects.PublishSubject.onNext + 231(PublishSubject.java:231)
at com.mlsdev.rximagepicker.RxImagePicker.onAttach + 76(RxImagePicker.java:76)
at androidx.fragment.app.FragmentManagerImpl.moveToState + 1404(FragmentManagerImpl.java:1404)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState + 1784(FragmentManagerImpl.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState + 1852(FragmentManagerImpl.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps + 802(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps + 2625(FragmentManagerImpl.java:2625)
at androidx.fragment.app.FragmentManagerImpl.transitToStyleIndex(FragmentManagerImpl.java:72)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether + 2411(FragmentManagerImpl.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute + 2366(FragmentManagerImpl.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions + 2273(FragmentManagerImpl.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run + 733(FragmentManagerImpl.java:733)
at android.os.Handler.handleCallback + 873(Handler.java:873)
at android.os.Handler.dispatchMessage + 99(Handler.java:99)
at android.os.Looper.loop + 214(Looper.java:214)
at android.app.ActivityThread.main + 7156(ActivityThread.java:7156)
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)

Camera permission not requesting

This works great with picking a file from gallery, but when i use camera, it would crash due to no camera permission. I am using api Android N api 24.

Need add orientation for request camera

When request camera capture, i need add

intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

in the code
cameraPictureUrl = createImageUri();
pictureChooseIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
pictureChooseIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraPictureUrl);
chooseCode = TAKE_PHOTO;
break;

Plase add the option orientation for this case thank you very much!

Send an onError on when permissions is denied by user and a rationale has to be show to the user

Send an onError on when permissions is denied by user and a rationale has to be show to the user.

When there is a situation that user has chosen to not to ask for permission again then the request permission does not work. This is intended as documented in permissions. However, https://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String) allows the app to show a rationale dialog box. Passing this flag in onError would help.

Crashes when takes photo from camera

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ints.elmerpro/com.mlsdev.rximagepicker.HiddenActivity}: java.lang.NullPointerException: file
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2477)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1345)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5438)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:762)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.NullPointerException: file
at android.net.Uri.fromFile(Uri.java:452)
at com.mlsdev.rximagepicker.HiddenActivity.handleIntent(HiddenActivity.java:82)
at com.mlsdev.rximagepicker.HiddenActivity.onCreate(HiddenActivity.java:36)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2370)
... 9 more
java.lang.NullPointerException: file
at android.net.Uri.fromFile(Uri.java:452)
at com.mlsdev.rximagepicker.HiddenActivity.handleIntent(HiddenActivity.java:82)
at com.mlsdev.rximagepicker.HiddenActivity.onCreate(HiddenActivity.java:36)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2370)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2477)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1345)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5438)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:762)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)

let parent app decide if it should allowBackup

in the manifest

    <application
    android:allowBackup="true"
    android:label="@string/app_name"
    android:supportsRtl="true">

can you remove the fields allowBackup and supportsRtl and let the parent app decide on these fields?

Convert Uri to Bitmap doesn't work for some images

I think there is nothing to do with RxImagePicker about this issue.

By capturing from camera with convert options Uri to Bitmap. It does show image in imageview And selecting image from gallery with same convert option It shows image in imageview successfully if image size is less than 2 MB other wise It doesn't show.
There is some issue with larger images.

I can see this warning

Bitmap too large to be uploaded into a texture (4160x3120, max=4096x4096)

It works properly with other two convert options [Load from Uri, Convert Uri to File]

RxJava2

Is there any plans for RxJava2 compatibility? Because for now i should have both versions to make things work(and it's really bad). Thanks

Release a new version?

Seems like the library haven't been updated in the Bintray artifactory after merging the RESULT_CANCELED fix. Could you please release a new version with the latest changes from master?

Can't get version 2.2.1 to work from Android Java project

I've upgraded my project to use AndroidX and RxImagePicker 2.2.1, which broke my code:

@Override
public void onPhotoReadyAction(final Sources pickerSource, final int imageTargetId) {
    Log.d(TAG, String.format("onPhotoReadyAction() --> requestImage() for sources: %s and imageTargetId: %d", pickerSource, imageTargetId));
    photoConverterDisposable = RxImagePicker.Companion.with(activity.getSupportFragmentManager()).requestImage(pickerSource)
            .flatMap((Function<Uri, ObservableSource<Base64Wrapper>>) uri -> ImageConverter.uriToBase64(activity, uri))
            .subscribe(base64Wrapper -> {
                Log.i(TAG, "onPhotoReadyAction() --> requestImage() DONE --> setPhoto() for base64Wrapper: " + base64Wrapper);
                setPhoto(imageTargetId, base64Wrapper);
            });
    activeRequests.add(photoConverterDisposable);
}

My code breaks on the line RxImagePicker.with(activity.getSupportFragmentManager()).requestImage(pickerSource)

with the error: "Cannot resolve method 'with(androidx.fragment.app.FragmentManager)"

Please help

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.