Drjacky / ImagePicker

📸Image Picker for Android, Pick images from Gallery or Capture a new image with Camera🖼
https://github.com/Drjacky/ImagePicker
Apache License 2.0
230 stars 57 forks source link

Image compression not working in android 12 when crop not enabled #90

Closed letscodewithkalyan closed 1 year ago

letscodewithkalyan commented 1 year ago

Describe the bug I added .maxResultSize(512, 512, false) while request camera only. I am getting image size 3072* 4080. No image compression.

To Reproduce

 galleryLauncher.launch(
            ImagePicker.with(this)
                .galleryOnly()
                .maxResultSize(512, 512, false)
                .setMultipleAllowed(true)
//                .setOutputFormat(Bitmap.CompressFormat.WEBP)
                .cropFreeStyle()
                .galleryMimeTypes( // no gif images at all
                    mimeTypes = arrayOf(
                        "image/png",
                        "image/jpg",
                        "image/jpeg"
                    )
                )
                .createIntent()
        )

In Sample project launch this and check the image size

Expected behavior Image resolution should be less than mentioned.

Additional context Downloaded code and checked code in CompressionProvider Class below method returning size as zero

 /**
     *
     * @param file File to get Image Size
     * @return Int Array, Index 0 has width and Index 1 has height
     */
    private fun getImageSize(uri: Uri): IntArray {
        val options = BitmapFactory.Options()
        options.inJustDecodeBounds = true
        //BitmapFactory.decodeFile(uri.path, options)
        BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
        return intArrayOf(options.outWidth, options.outHeight)
    }

This function

Drjacky commented 1 year ago

You said:

... while request camera only.

but in your sample code, it's gallery.

Should I test by camera or gallery?

Drjacky commented 1 year ago

Fixed on 2.3.21.

letscodewithkalyan commented 1 year ago

Thanks quick reply and fix but Still issue exist @Drjacky . I modified sample app like below ImagePicker.with(this) .galleryOnly() .maxResultSize(128, 128, false) .setMultipleAllowed(true) .galleryMimeTypes( // no gif images at all mimeTypes = arrayOf( "image/png", "image/jpg", "image/jpeg" ) ) .createIntent()

Observed issue without cropping mention maxResultSize.

  1. In CompressionProvider compressTask Two places issue exist BitmapFactory.decodeFile(uri.path, BitmapFactory.Options ()) returning null
  2. In ImagePickerActivity setCompressedImage method not written well
Screenshot 2022-12-19 at 7 32 26 PM Screenshot 2022-12-19 at 7 32 33 PM
asadwaheed1 commented 1 year ago
private fun pickCameraImage() {
        cameraLauncher.launch(
            ImagePicker.with(this.requireActivity())
                .cameraOnly()
                .maxResultSize(500, 500, true)
                .createIntent()
        )
    }

    private val cameraLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == Activity.RESULT_OK) {
                val uri = it.data?.data!!
                mCameraUri = uri
            } else {
                parseError(it)
            }
        }

Above piece of code is also giving this error below:

Unable to decode stream: java.io.FileNotFoundException: /external_files/Android/data/com.example.app/files/DCIM/Camera/IMG_20230215_140915365.jpg: open failed: ENOENT (No such file or directory)
2023-02-15 14:09:19.949 30475-30475 AndroidRuntime          com.example.app                  E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.app, PID: 30475
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                                        at com.github.drjacky.imagepicker.provider.CompressionProvider.compressTask(CompressionProvider.kt:72)
                                                                                                        at com.github.drjacky.imagepicker.provider.CompressionProvider.access$compressTask(CompressionProvider.kt:24)
                                                                                                        at com.github.drjacky.imagepicker.provider.CompressionProvider$compress$1.invokeSuspend(CompressionProvider.kt:58)
                                                                                                        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                        at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)
                                                                                                        at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
                                                                                                        at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
                                                                                                        at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
                                                                                                        at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
                                                                                                        at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
                                                                                                        at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
                                                                                                        at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
                                                                                                        at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
                                                                                                        at com.github.drjacky.imagepicker.provider.CompressionProvider.compress(CompressionProvider.kt:57)
                                                                                                        at com.github.drjacky.imagepicker.ImagePickerActivity.setImage(ImagePickerActivity.kt:172)
                                                                                                        at com.github.drjacky.imagepicker.provider.CameraProvider.handleResult(CameraProvider.kt:142)
                                                                                                        at com.github.drjacky.imagepicker.ImagePickerActivity.cameraLauncher$lambda$1(ImagePickerActivity.kt:59)
                                                                                                        at com.github.drjacky.imagepicker.ImagePickerActivity.$r8$lambda$TbnVizF4DKsKWrDO5-zrgXMal9g(Unknown Source:0)
                                                                                                        at com.github.drjacky.imagepicker.ImagePickerActivity$$ExternalSyntheticLambda1.onActivityResult(Unknown Source:4)
                                                                                                        at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:149)
                                                                                                        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360)
                                                                                                        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271)
                                                                                                        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313)
                                                                                                        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151)
                                                                                                        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
                                                                                                        at androidx.lifecycle.ReportFragment.dispatch(ReportFragment.java:68)
                                                                                                        at androidx.lifecycle.ReportFragment$LifecycleCallbacks.onActivityPostStarted(ReportFragment.java:187)
                                                                                                        at android.app.Activity.dispatchActivityPostStarted(Activity.java:1430)
                                                                                                        at android.app.Activity.performStart(Activity.java:8324)
                                                                                                        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3757)
                                                                                                        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
                                                                                                        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                        at android.os.Looper.loop(Looper.java:299)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8105)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
                                                                                                        Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@b3250f, Dispatchers.Main.immediate]
2023-02-15 14:09:19.952 30475-30475 OOMEventManagerFK       com.example.app                     

I noticed it happened after I removed crop() option

JustKhit commented 1 year ago
private fun pickCameraImage() {
        cameraLauncher.launch(
            ImagePicker.with(this.requireActivity())
                .cameraOnly()
                .maxResultSize(500, 500, true)
                .createIntent()
        )
    }

    private val cameraLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == Activity.RESULT_OK) {
                val uri = it.data?.data!!
                mCameraUri = uri
            } else {
                parseError(it)
            }
        }

Above piece of code is also giving this error below:

Unable to decode stream: java.io.FileNotFoundException: /external_files/Android/data/com.example.app/files/DCIM/Camera/IMG_20230215_140915365.jpg: open failed: ENOENT (No such file or directory)
2023-02-15 14:09:19.949 30475-30475 AndroidRuntime          com.example.app                  E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.app, PID: 30475
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                                      at com.github.drjacky.imagepicker.provider.CompressionProvider.compressTask(CompressionProvider.kt:72)
                                                                                                      at com.github.drjacky.imagepicker.provider.CompressionProvider.access$compressTask(CompressionProvider.kt:24)
                                                                                                      at com.github.drjacky.imagepicker.provider.CompressionProvider$compress$1.invokeSuspend(CompressionProvider.kt:58)
                                                                                                      at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                      at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)
                                                                                                      at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
                                                                                                      at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
                                                                                                      at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
                                                                                                      at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
                                                                                                      at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
                                                                                                      at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
                                                                                                      at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
                                                                                                      at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
                                                                                                      at com.github.drjacky.imagepicker.provider.CompressionProvider.compress(CompressionProvider.kt:57)
                                                                                                      at com.github.drjacky.imagepicker.ImagePickerActivity.setImage(ImagePickerActivity.kt:172)
                                                                                                      at com.github.drjacky.imagepicker.provider.CameraProvider.handleResult(CameraProvider.kt:142)
                                                                                                      at com.github.drjacky.imagepicker.ImagePickerActivity.cameraLauncher$lambda$1(ImagePickerActivity.kt:59)
                                                                                                      at com.github.drjacky.imagepicker.ImagePickerActivity.$r8$lambda$TbnVizF4DKsKWrDO5-zrgXMal9g(Unknown Source:0)
                                                                                                      at com.github.drjacky.imagepicker.ImagePickerActivity$$ExternalSyntheticLambda1.onActivityResult(Unknown Source:4)
                                                                                                      at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:149)
                                                                                                      at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360)
                                                                                                      at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271)
                                                                                                      at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313)
                                                                                                      at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151)
                                                                                                      at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
                                                                                                      at androidx.lifecycle.ReportFragment.dispatch(ReportFragment.java:68)
                                                                                                      at androidx.lifecycle.ReportFragment$LifecycleCallbacks.onActivityPostStarted(ReportFragment.java:187)
                                                                                                      at android.app.Activity.dispatchActivityPostStarted(Activity.java:1430)
                                                                                                      at android.app.Activity.performStart(Activity.java:8324)
                                                                                                      at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3757)
                                                                                                      at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
                                                                                                      at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
                                                                                                      at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
                                                                                                      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
                                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259)
                                                                                                      at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                      at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                      at android.os.Looper.loop(Looper.java:299)
                                                                                                      at android.app.ActivityThread.main(ActivityThread.java:8105)
                                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
                                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
                                                                                                      Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@b3250f, Dispatchers.Main.immediate]
2023-02-15 14:09:19.952 30475-30475 OOMEventManagerFK       com.example.app                     

I noticed it happened after I removed crop() option

I got this error too. Mine is: ImagePicker.with(this@AddSprayInspectionActivity) .maxResultSize(imageSize, imageSize, true) .provider(ImageProvider.BOTH) //Or bothCameraGallery() .createIntentFromDialog { launcher.launch(it) }

Any workaround or how to fix will be appreciated.

chplalex commented 9 months ago

I have the same issue:

Screenshot 2023-09-27 at 13 54 12

Screenshot 2023-09-27 at 13 56 18

chplalex commented 9 months ago

screenshot with the first error:

Screenshot 2023-09-27 at 13 57 50