Image Picker for Android 🤖

Overview

Android Image Picker

No config yet highly configurable image picker for Android

Android Arsenal - ImagePicker jitpack - android image picker

Screenshot

Click to see how image picker looks…

Download

Add this to your project's build.gradle

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

And add this to your module's build.gradle

dependencies {
  implementation 'com.github.esafirm:android-image-picker:x.y.z'
}

change x.y.z to version in the release page

Usage

For full example, please refer to the sample app.

Also you can browse the issue labeled as question here

Start image picker activity

The simplest way to start

val launcher = registerImagePicker {
  // handle result here
}

launcher.launch()

Complete features of what you can do with ImagePicker

val config = ImagePickerConfig {
  mode = ImagePickerMode.SINGLE // default is multi image mode
  language = "in" // Set image picker language
  theme = R.style.ImagePickerTheme

  // set whether pick action or camera action should return immediate result or not. Only works in single mode for image picker
  returnMode = if (returnAfterCapture) ReturnMode.ALL else ReturnMode.NONE

  isFolderMode = folderMode // set folder mode (false by default)
  isIncludeVideo = includeVideo // include video (false by default)
  isOnlyVideo = onlyVideo // include video (false by default)
  arrowColor = Color.RED // set toolbar arrow up color
  folderTitle = "Folder" // folder selection title
  imageTitle = "Tap to select" // image selection title
  doneButtonText = "DONE" // done button text
  limit = 10 // max images can be selected (99 by default)
  isShowCamera = true // show camera or not (true by default)
  savePath = ImagePickerSavePath("Camera") // captured image directory name ("Camera" folder by default)
  savePath = ImagePickerSavePath(Environment.getExternalStorageDirectory().path, isRelative = false) // can be a full path

  excludedImages = images.toFiles() // don't show anything on this selected images
  selectedImages = images  // original selected images, used in multi mode
}

If you want to call it outside Activity or Fragment, you can get the Intent with createImagePickerIntent

Please note: handling in onActivityResult is not recommended since it's already deprecated in favor of the new result API

val intent = createImagePickerIntent(context, ImagePickerConfig())
startActivityForResult(intent, RC_IMAGE_PICKER)

Receive result

when you're done picking images, result will be returned on launcher callback with type List. This list cannot be null but can be empty

val launcher = registerImagePicker { result: List<Image> ->
  result.forEach { image ->
    println(image)
  }
}    

Camera Only

Use CameraOnlyConfig instead of ImagePickerConfig

val launcher = registerImagePicker { }
launcher.launch(CameraOnlyConfig())

You also still can use the DefaultCameraModule but discouraged to do it.

Wiki

Version 2.x.x

If you still use the previous version, you can check 2.x branch in here

Support Me!

I would make myself more commited to this repo and OSS works in general.

Would you help me achieving this goals?

Buy Me a Coffee at ko-fi.com

Credits

License

MIT @ Esa Firman

Comments
  • Camera Captured Image is not showing in gallary in Oreo

    Camera Captured Image is not showing in gallary in Oreo

    Hello,

    Downloaded code and run in Oreo device, observed that if you capture images from camera then it is not showing in gallery, only if device OS is Oreo. Which is working fine in Nougat and Marshmallow devices.

    Any suggestion???

    opened by taskfriendinc 22
  • NoSuchFieldError

    NoSuchFieldError

    FATAL EXCEPTION: main java.lang.NoSuchFieldError: com.esafirm.imagepicker.R$id.menu_camera at com.esafirm.imagepicker.features.ImagePickerActivity.onPrepareOptionsMenu(ImagePickerActivity.java:201) at android.app.Activity.onPreparePanel(Activity.java:2600) at android.support.v4.app.FragmentActivity.onPrepareOptionsPanel(FragmentActivity.java:532) at android.support.v4.app.FragmentActivity.onPreparePanel(FragmentActivity.java:521) at android.support.v7.view.WindowCallbackWrapper.onPreparePanel(WindowCallbackWrapper.java:93) at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onPreparePanel(AppCompatDelegateImplBase.java:358) at android.support.v7.view.WindowCallbackWrapper.onPreparePanel(WindowCallbackWrapper.java:93) at android.support.v7.app.ToolbarActionBar$ToolbarCallbackWrapper.onPreparePanel(ToolbarActionBar.java:567) at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:455) at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5388) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:655) at dalvik.system.NativeStart.main(Native Method)

    bug help wanted 
    opened by amalive 16
  • Can not move to previous screen

    Can not move to previous screen

    I pressed the back button at folderMode(false). It will not go back to the previous screen.

    ImagePicker.create(this) .returnAfterFirst(true) .folderMode(false) .multi() .limit(10) .showCamera(false) .enableLog(false) .start(PICK_IMAGE_MULTIPLE);

    opened by pavecho 15
  • Use READ_EXTERNAL_STORAGE instead of WRITE on android11.

    Use READ_EXTERNAL_STORAGE instead of WRITE on android11.

    In android11 "write_external_storage" permission is ignored. So I change to use "read" permission instead of "write" on scoped storage devices.

    Related https://github.com/esafirm/android-image-picker/issues/361, https://github.com/esafirm/android-image-picker/issues/341

    opened by xpdlf1004 14
  • I am using 1.8.0 but i dont need glide is it possible with this library

    I am using 1.8.0 but i dont need glide is it possible with this library

    I am using fresco for image loading, and with this library glide gets added in my external libraries how to remove it?

    in your dependencies: final glideVersion = '4.5.0' implementation "com.github.bumptech.glide:glide:$glideVersion"

    is it possible to use it without glide?

    opened by amankumarjain 12
  • The image file could not be opened in targetsdkversion 29

    The image file could not be opened in targetsdkversion 29

    Expected Behavior

    Set / change profile picture

    Actual Behavior

    ERROR:The image file could not be opened

    Specifications

    • Image Picker Version: 2.1.10
    • Android OS:10
    • Phone: Nokia 8.1

    Code :

    openGallery():Promise<string>{
        return new Promise((resolve,reject)=>{
          this.checkPermission().then(granted=>{
            if (granted) {
    
              let options = {
                quality:80,
                maximumImagesCount:1
              };
    
              this.picker.getPictures(options).then(uri=>{
                console.log("URI of picked image "+uri);
                this.cropImage(uri.toString()).then(croppedImage=>{
                  resolve(croppedImage);
                }).catch(err=>{
                  reject("error in cropIMage "+JSON.stringify(err));
                  console.log("error in getPrictures_crop "+JSON.stringify(err))
                })
              }).catch(err=>{
                 reject("error in getPictures "+JSON.stringify(err));
                 console.log("getPictures "+err);
              })
            }
          })
        })
      }
    
    
    opened by codehack26 11
  • Failed to open libwvm.so: dlopen failed: library

    Failed to open libwvm.so: dlopen failed: library "libwvm.so" not found

    Hi, thanks for this very good library, really saved my life when app needs picking multiple images. However, currently I get a only one problem which specific on Xiaomi android devices:

    Failed to open libwvm.so: dlopen failed: library "libwvm.so" not found
    

    Totally have no idea why this error happen, and other device just ok. I know it's Xiaomi's problem, but I am in China and this device are so many, how to solve this anyway?

    opened by jinfagang 11
  • INTENT_EXTRA_SELECTED_IMAGES missing [Update Readme]

    INTENT_EXTRA_SELECTED_IMAGES missing [Update Readme]

    Your Readme file says, I should use ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES constant to get array of selected images, but it's missing. From your code I can see it's "selectedImages". Maybe, you should bring it back or change Readme. Thanks.

    enhancement 
    opened by ysoftware 10
  • Fragment not attached to a context

    Fragment not attached to a context

    Expected Behavior

    Should open imager picker from fragment

    Actual Behavior

    Fragment h{9e363cc} (782f797a-94b7-4939-b68b-a5a1b80e4374) not attached to a context. App crashed

    Steps to Reproduce the Problem

    1. register lister in a fragment val launcher = registerImagePicker { imageList: List -> }
    2. navigate to the fragment (not using nav component here)

    Specifications

    • Image Picker Version: 3.0.0-beta1
    • Android OS: 10/11
    • Phone: mi Note 7 pro
    opened by anupdey99 9
  • 2.3.1 Version not working when app is in release mode

    2.3.1 Version not working when app is in release mode

    W/Glide: Load failed for /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg with size [512x512] class com.bumptech.glide.load.engine.GlideException: Failed to load resource There were 3 causes: java.io.FileNotFoundException(/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg: open failed: EACCES (Permission denied)) java.io.FileNotFoundException(open failed: EACCES (Permission denied)) java.io.FileNotFoundException(open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, LOCAL There was 1 cause: java.io.FileNotFoundException(/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg: open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed There was 1 cause: java.io.FileNotFoundException(/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg: open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg: open failed: EACCES (Permission denied) Cause (2 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.os.ParcelFileDescriptor, LOCAL There was 1 cause: java.io.FileNotFoundException(open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed There was 1 cause: java.io.FileNotFoundException(open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: open failed: EACCES (Permission denied) Cause (3 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL There was 1 cause: java.io.FileNotFoundException(open failed: EACCES (Permission denied)) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: open failed: EACCES (Permission denied) I/Glide: Root cause (1 of 3) java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200528-WA0006.jpg: open failed: EACCES (Permission denied) at libcore.io.IoBridge.open(IoBridge.java:496) at java.io.FileInputStream.(FileInputStream.java:159) at java.io.FileInputStream.(FileInputStream.java:115) at android.content.ContentResolver.openInputStream(ContentResolver.java:1187) at com.bumptech.glide.load.data.o.b(StreamLocalUriFetcher.java:74) at com.bumptech.glide.load.data.o.a(StreamLocalUriFetcher.java:50) at com.bumptech.glide.load.data.o.a(StreamLocalUriFetcher.java:13) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:44) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.n(DecodeJob.java:279) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919) at com.bumptech.glide.load.engine.executor.a$b$a.run(GlideExecutor.java:393) Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) at libcore.io.Linux.open(Native Method) at libcore.io.ForwardingOs.open(ForwardingOs.java:167) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252) at libcore.io.ForwardingOs.open(ForwardingOs.java:167) at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255) at libcore.io.IoBridge.open(IoBridge.java:482) at java.io.FileInputStream.(FileInputStream.java:159)  at java.io.FileInputStream.(FileInputStream.java:115)  at android.content.ContentResolver.openInputStream(ContentResolver.java:1187)  at com.bumptech.glide.load.data.o.b(StreamLocalUriFetcher.java:74)  at com.bumptech.glide.load.data.o.a(StreamLocalUriFetcher.java:50)  at com.bumptech.glide.load.data.o.a(StreamLocalUriFetcher.java:13)  at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:44)  at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100)  at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70)  at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63)  at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310)  at com.bumptech.glide.load.engine.DecodeJob.n(DecodeJob.java:279)  at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:919)  at com.bumptech.glide.load.engine.executor.a$b$a.run(GlideExecutor.java:393)  Root cause (2 of 3) java.io.FileNotFoundException: open failed: EACCES (Permission denied) at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:319) at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:224) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1500) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1422) at com.bumptech.glide.load.data.i.a(FileDescriptorLocalUriFetcher.java:20) at com.bumptech.glide.load.data.i.a(FileDescriptorLocalUriFetcher.java:12) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:44) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.a(DecodeJob.java:408) at com.bumptech.glide.load.engine.w.a(SourceGenerator.java:160) at com.bumptech.glide.load.engine.w$a.a(SourceGenerator.java:83) at com.bumptech.glide.load.model.q$a.d(MultiModelLoader.java:167) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:154) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:49) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.n(DecodeJob.java:279) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919) at com.bumptech.glide.load.engine.executor.a$b$a.run(GlideExecutor.java:393) I/Glide: Root cause (3 of 3) java.io.FileNotFoundException: open failed: EACCES (Permission denied) at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:319) at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:224) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1500) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1422) at com.bumptech.glide.load.data.a.a(AssetFileDescriptorLocalUriFetcher.java:20) at com.bumptech.glide.load.data.a.a(AssetFileDescriptorLocalUriFetcher.java:11) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:44) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.a(DecodeJob.java:408) at com.bumptech.glide.load.engine.w.a(SourceGenerator.java:160) at com.bumptech.glide.load.engine.w$a.a(SourceGenerator.java:83) at com.bumptech.glide.load.model.q$a.d(MultiModelLoader.java:167) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:154) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:49) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.a(DecodeJob.java:408) at com.bumptech.glide.load.engine.w.a(SourceGenerator.java:160) at com.bumptech.glide.load.engine.w$a.a(SourceGenerator.java:83) at com.bumptech.glide.load.model.q$a.d(MultiModelLoader.java:167) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:154) at com.bumptech.glide.load.data.l.a(LocalUriFetcher.java:49) at com.bumptech.glide.load.model.q$a.a(MultiModelLoader.java:100) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:70) at com.bumptech.glide.load.engine.w.b(SourceGenerator.java:63) at com.bumptech.glide.load.engine.DecodeJob.l(DecodeJob.java:310) at com.bumptech.glide.load.engine.DecodeJob.n(DecodeJob.java:279) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919) at com.bumptech.glide.load.engine.executor.a$b$a.run(GlideExecutor.java:393)

    Steps to Reproduce the Problem

    1. run in release build
    2. try to load image in glide using image.getPath()

    Specifications

    • Image Picker Version: 2.3.1
    • Android OS: 10
    • Phone: Nokia 6.1
    opened by covocisdev 9
  • Crash in android 10

    Crash in android 10

    App crashes with bellows log report

        java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter folderName
            at com.esafirm.imagepicker.model.Folder.<init>(Unknown Source:2)
            at com.esafirm.imagepicker.features.fileloader.DefaultImageFileLoader$ImageLoadRunnable.run(DefaultImageFileLoader.java:166)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:919)
    

    Specifications

    • Image Picker Version: 2.4.1
    • Android OS: Android 10
    • Phone: Galaxy s20
    opened by Farhandroid 8
Releases(3.0.0)
  • 3.0.0(Nov 11, 2022)

    Highlight

    • New API to run the image picker and get the result
    val launcher = registerImagePicker { result: List<Image> ->
      result.forEach { image ->
        println(image)
      }
    }    
    
    • Multiple bugfixes 🐛
    • Android Q support 🤖
    • Updates on the tooling (AGP, KGP) 📓
    • More translations 🎏

    Thanks to all the contributors that can make this happen!

    What's Changed

    • Fix display video duration cause app crash when targeting to sdk 29 and fix display media file under root in folder mode by @wiwuwa in https://github.com/esafirm/android-image-picker/pull/331
    • Japanese support by @kckuo920248 in https://github.com/esafirm/android-image-picker/pull/332
    • Refactor kotlin by @esafirm in https://github.com/esafirm/android-image-picker/pull/338
    • Refactor launcher by @esafirm in https://github.com/esafirm/android-image-picker/pull/342
    • update readme by @esafirm in https://github.com/esafirm/android-image-picker/pull/343
    • Fix memory leak by @esafirm in https://github.com/esafirm/android-image-picker/pull/344
    • Toolbar Done button visibility. by @dilip786 in https://github.com/esafirm/android-image-picker/pull/347
    • set target and compile sdk to 30 by @esafirm in https://github.com/esafirm/android-image-picker/pull/353
    • Hash code and equals by @esafirm in https://github.com/esafirm/android-image-picker/pull/354
    • fix fragment not attached to context exception by @michaelsam94 in https://github.com/esafirm/android-image-picker/pull/363
    • Optimize load images by @esafirm in https://github.com/esafirm/android-image-picker/pull/364
    • custom ui adjustment by @esafirm in https://github.com/esafirm/android-image-picker/pull/365
    • fix on crash camera only cancel by @esafirm in https://github.com/esafirm/android-image-picker/pull/366
    • fix sort on q by @esafirm in https://github.com/esafirm/android-image-picker/pull/369
    • Fix stuff by @esafirm in https://github.com/esafirm/android-image-picker/pull/370
    • camera only back press crash fixed by @shamsshykh in https://github.com/esafirm/android-image-picker/pull/398
    • Add Swedish translation by @ghostbear in https://github.com/esafirm/android-image-picker/pull/386
    • Add spanish and catalan translations by @pballart in https://github.com/esafirm/android-image-picker/pull/376
    • Add camera permission english string (#405) by @alessandrotedd in https://github.com/esafirm/android-image-picker/pull/406
    • add vi language by @chihung93 in https://github.com/esafirm/android-image-picker/pull/407
    • Fix - Change barista dependency by @esafirm in https://github.com/esafirm/android-image-picker/pull/415
    • Add permission check for android13 by @masato1230 in https://github.com/esafirm/android-image-picker/pull/404
    • fix deprecated pickCamera by @chihung93 in https://github.com/esafirm/android-image-picker/pull/408
    • BugFix: Image count visible in the folder mode when moved from one folder to another by @kavitamp in https://github.com/esafirm/android-image-picker/pull/410
    • upgrade AGP and Kotlin version by @esafirm in https://github.com/esafirm/android-image-picker/pull/416
    • Code cleanup by @esafirm in https://github.com/esafirm/android-image-picker/pull/421

    New Contributors

    • @wiwuwa made their first contribution in https://github.com/esafirm/android-image-picker/pull/331
    • @kckuo920248 made their first contribution in https://github.com/esafirm/android-image-picker/pull/332
    • @dilip786 made their first contribution in https://github.com/esafirm/android-image-picker/pull/347
    • @michaelsam94 made their first contribution in https://github.com/esafirm/android-image-picker/pull/363
    • @shamsshykh made their first contribution in https://github.com/esafirm/android-image-picker/pull/398
    • @ghostbear made their first contribution in https://github.com/esafirm/android-image-picker/pull/386
    • @pballart made their first contribution in https://github.com/esafirm/android-image-picker/pull/376
    • @alessandrotedd made their first contribution in https://github.com/esafirm/android-image-picker/pull/406
    • @chihung93 made their first contribution in https://github.com/esafirm/android-image-picker/pull/407
    • @masato1230 made their first contribution in https://github.com/esafirm/android-image-picker/pull/404
    • @kavitamp made their first contribution in https://github.com/esafirm/android-image-picker/pull/410

    Full Changelog: https://github.com/esafirm/android-image-picker/compare/2.4.2...3.0.0

    Source code(tar.gz)
    Source code(zip)
  • 3.0.0-beta1(Apr 24, 2021)

  • 2.4.5(Mar 18, 2021)

    • Fix folder name & image name NPE https://github.com/esafirm/android-image-picker/pull/316
    • Add optional save image functionality https://github.com/esafirm/android-image-picker/pull/312
    • Fix Display Video Crash https://github.com/esafirm/android-image-picker/commit/a26b0f657d51927cfd6b322098dd9280bc025c26
    • Japanese support https://github.com/esafirm/android-image-picker/pull/332

    Thanks to all the contributors! 🔥

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Oct 3, 2020)

    • Add getUri() for convenient #285
    • Fixes for Android Q #290 #293
    • Fixed some typo #291
    • Show video duration on the image picker #271
    • Use github workflow instead of CircleCI
    • Migrate sample to Kotlin #295

    Thanks to @hjchin @sr1dh4r @xpdlf1004 @LinX64 for the PR 🔥

    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(May 22, 2020)

  • 2.2.0(Oct 13, 2019)

  • 2.1.0(Aug 4, 2019)

  • 2.0.0(Feb 26, 2019)

    • ImagePicker is now in Fragment and you can use it in custom UI (please see sample)
    • Remove Retrolambda
    • Compatibility with Glide 4.9.0
    • Add Option to exclude GIF from image picker
    • Bug fixes and improvements

    Also, we integrate our repo with CircleCi and add issue templating, because we want to improve our development experience in general

    Source code(tar.gz)
    Source code(zip)
  • 1.13.1(Jun 18, 2018)

  • 1.13.0(Jul 21, 2018)

    • Back arrow support RTL
    • Update to AGP 3.1 and Gradle 4.4
    • Add Arabic translation
    • Better permissions handling for cameraOnly mode
    • Basic video support
    • Set language programmatically
    • Some internal changes
    Source code(tar.gz)
    Source code(zip)
  • 1.12.0(Jan 17, 2018)

    BREAKING CHANGES!!!

    • [New] Return Mode API returnMode
    Define the ImagePicker return behaviour
    1. ReturnMode.NONE -> When image is picked, ImagePickerActivity will not dismissed even in Single Mode
    2. ReturnMode.ALL -> When image is picked dismiss then deliver result
    3. ReturnMode.CAMERA_ONLY -> When image is picked with Camera, dismiss then deliver the result
    4. ReturnMode.GALLERY_ONLY -> Same as CAMERA_ONLY but with Gallery
    

    So if you want to mimic the setReturnAfterFirst behavior, all you have to do is

    ImagePicker.create(activity).setReturnMode(ReturnMode.ALL).start()
    
    • setReturnAfterFirst is now obsolete
    • [New] set toolbar arrow color with toolbarArrowColor(int color)
    • Rename ImagePicker methods
      • folderTitle -> toolbarFolderTitle
      • imageTitle -> toolbarImageTitle
    • Add capability to start without a request code

    So instead of this

    ImagePicker.cameraOnly().start(RC_CAMERA /* int */);
    

    Now you can do this

    ImagePicker.cameraOnly().start()
    

    BUT, you have to handle the result with the helper method from ImagePicker

     @Override
       protected void onActivityResult(int requestCode, final int resultCode, Intent data) {
           if (ImagePicker.shouldHandle(requestCode, resultCode, data)) {
               // do your things
           }
           super.onActivityResult(requestCode, resultCode, data);
       }
    

    You can still use the usual result check if you define the request code by yourself.

    • Add convenience method ImagePicker.getFirstImageOrNull(Intent data) to fetch only first image from the result or return null
    Source code(tar.gz)
    Source code(zip)
  • 1.11.0(Jan 11, 2018)

    Now you can exclude image from being shown in the picker

    ImagePicker.create(this)
        .exclude(image)           // exclude everything in `List<Image>`
        .excludeFiles(files)      // or you can exclude everything in `List<File>` 
        .start(RQ)
    
    Source code(tar.gz)
    Source code(zip)
  • 1.10.1(Jan 11, 2018)

  • 1.10.0(Jan 5, 2018)

  • 1.8.0(Sep 2, 2017)

    Enhancement

    • https://github.com/esafirm/android-image-picker/issues/70 - Now if nothing is selected and you define your image title explicitly, the toolbar will show the defined title.

    • https://github.com/esafirm/android-image-picker/pull/69 - Add French translation. Thanks @Jerome67000

    Breaking Changes

    ImagePickerConfigFactory.create() and ImagePicker.init() don't take Context anymore

    Source code(tar.gz)
    Source code(zip)
  • 1.7.5(Jul 30, 2017)

    Bug Fix

    • https://github.com/esafirm/android-image-picker/issues/65
    • Cannot unselect image that passed from the builder

    New Feature

    • Set the full path for saving camera Image
    public ImagePicker imageFullDirectory(String fullPath) {
            config.setImageFullDirectory(fullPath);
            return this;
        }
    

    Internal

    • Excluding unnecessary Android Support modules
    Source code(tar.gz)
    Source code(zip)
  • 1.7.4(Jul 9, 2017)

  • 1.7.3(Jul 5, 2017)

    Changelog:

    1. Fix back button issue when setFolderMode set to true
    2. Expose ImagePickerConfig in ImagePicker. Now you can override getConfig() before called by getIntent()
    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(May 27, 2017)

    • Fix SnackBar issue when permission is not granted
    • Add toggle log feature.
    ImagePicker.enableLog(false)
    

    Also highlighting the previous changes in 1.6.0

    • Adding custom ImageLoader
    • Removing traditional intent stater
    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Apr 2, 2017)

    Add theme support

    Usage:

    ImagePicker imagePicker = ImagePicker.create(this)
                    .theme(R.style.ImagePickerTheme)
                    .start(RC_IMAGE_PICKER);
    

    Where ImagePickerTheme extend from ef_BaseTheme

    See example for more reference.

    Source code(tar.gz)
    Source code(zip)
  • 1.4.1(Mar 30, 2017)

Owner
Esa Firman
I use Vim to write my commit messages.
Esa Firman
Media Picker is an Android Libary that lets you to select multiple images or video

Media Picker Please let me know if your application go to production via this link Media Picker is an Android Libary that lets you to select multiple

Abdullah Alhazmy 264 Nov 10, 2022
An image loading and caching library for Android focused on smooth scrolling

Glide | View Glide's documentation | 简体中文文档 | Report an issue with Glide Glide is a fast and efficient open source media management and image loading

Bump Technologies 33.2k Jan 7, 2023
Android Asynchronous Networking and Image Loading

Android Asynchronous Networking and Image Loading Download Maven Git Features Kotlin coroutine/suspend support Asynchronously download: Images into Im

Koushik Dutta 6.3k Dec 27, 2022
A powerful image downloading and caching library for Android

Picasso A powerful image downloading and caching library for Android For more information please see the website Download Download the latest AAR from

Square 18.4k Jan 6, 2023
Image loading for Android backed by Kotlin Coroutines.

An image loading library for Android backed by Kotlin Coroutines. Coil is: Fast: Coil performs a number of optimizations including memory and disk cac

Coil 8.8k Jan 8, 2023
An Android transformation library providing a variety of image transformations for Glide.

Glide Transformations An Android transformation library providing a variety of image transformations for Glide. Please feel free to use this. Are you

Daichi Furiya 9.7k Dec 30, 2022
An android image compression library.

Compressor Compressor is a lightweight and powerful android image compression library. Compressor will allow you to compress large photos into smaller

Zetra 6.7k Jan 9, 2023
An Android transformation library providing a variety of image transformations for Picasso

Picasso Transformations An Android transformation library providing a variety of image transformations for Picasso. Please feel free to use this. Are

Daichi Furiya 1.7k Jan 5, 2023
Library to handle asynchronous image loading on Android.

WebImageLoader WebImageLoader is a library designed to take to hassle out of handling images on the web. It has the following features: Images are dow

Alexander Blom 102 Dec 22, 2022
Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法

Luban ?? English Documentation Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。 Luban-turbo —— 鲁班项目的turbo版本,查看trubo分支。 写在前面 家境贫寒,工作繁忙。只能不定期更新,还望网友们见谅! 项目描述 目前做A

郑梓斌 13.1k Jan 7, 2023
🍂 Jetpack Compose image loading library which can fetch and display network images using Glide, Coil, and Fresco.

?? Jetpack Compose image loading library which can fetch and display network images using Glide, Coil, and Fresco.

Jaewoong Eum 1.4k Jan 2, 2023
ZoomableComposeImage - A zoomable image for jetpack compose

ZoomableComposeImage - A zoomable image for jetpack compose

RERERE 10 Dec 11, 2022
ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image

compose-image-blurhash ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image while the real

Orlando Novas Rodriguez 24 Nov 18, 2022
Easy to use, lightweight custom image view with rounded corners.

RoundedImageView Easy to use, lightweight custom image view with rounded corners. Explore the docs » View Demo · Report Bug · Request Feature About Th

Melik Mehmet Özyildirim 6 Dec 23, 2021
load-the-image Apply to compose-jb(desktop), Used to load network and local pictures.

load-the-image load-the-image Apply to compose-jb(desktop), Used to load network and local pictures. ?? Under construction It may change incompatibly

lt_taozi 13 Dec 29, 2022
Compose Image library for Kotlin Multiplatform.

Compose ImageLoader Compose Image library for Kotlin Multiplatform. Setup Add the dependency in your common module's commonMain sourceSet kotlin {

Seiko 45 Dec 29, 2022
Powerful and flexible library for loading, caching and displaying images on Android.

Universal Image Loader The great ancestor of modern image-loading libraries :) UIL aims to provide a powerful, flexible and highly customizable instru

Sergey Tarasevich 16.8k Jan 8, 2023
An Android library for managing images and the memory they use.

Fresco Fresco is a powerful system for displaying images in Android applications. Fresco takes care of image loading and display, so you don't have to

Facebook 16.9k Jan 8, 2023
Adds touch functionality to Android ImageView.

TouchImageView for Android Capabilities TouchImageView extends ImageView and supports all of ImageView’s functionality. In addition, TouchImageView ad

Michael Ortiz 2.6k Jan 1, 2023