Android CameraX: java.lang.IllegalStateException: maxImages (2) has already been acquired, call #close before acquiring more

1,323 views
Skip to first unread message

Prajwal Bhat

unread,
Jun 11, 2020, 1:44:05 PM6/11/20
to Android CameraX Discussion Group
When multiple images are being captured, getting an exception as:

D/MetadataImageReader: Failed to acquire next image.
    java
.lang.IllegalStateException: maxImages (2) has already been acquired, call #close before acquiring more.
        at android
.media.ImageReader.acquireNextImage(ImageReader.java:513)
        at androidx
.camera.core.AndroidImageReaderProxy.acquireNextImage(AndroidImageReaderProxy.java:79)
        at androidx
.camera.core.MetadataImageReader.imageIncoming(MetadataImageReader.java:318)
        at androidx
.camera.core.MetadataImageReader$2.onImageAvailable(MetadataImageReader.java:67)
        at androidx
.camera.core.AndroidImageReaderProxy$1$1.run(AndroidImageReaderProxy.java:145)
        at android
.os.Handler.handleCallback(Handler.java:883)
        at android
.os.Handler.dispatchMessage(Handler.java:100)
        at android
.os.Looper.loop(Looper.java:237)
        at android
.app.ActivityThread.main(ActivityThread.java:7814)
        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:1075)

Here is the code: 
    private void takePicture()  {
    imageCapture
.setFlashMode(flashMode);
    imageCapture
.takePicture(cameraExecutor, new ImageCapture.OnImageCapturedCallback() {
       
@SuppressLint("UnsafeExperimentalUsageError")
       
@Override
       
public void onCaptureSuccess(@NonNull ImageProxy image) {
           
Bitmap imageBitmap = rotateImage(imageToBitmap(Objects.requireNonNull(image.getImage())), image.getImageInfo().getRotationDegrees());
           
try {
               
FileUtil.saveBitmap(MainActivity.this, imageBitmap);

           
} catch (IOException e) {
                e
.printStackTrace();
           
}
            image
.close();
           
super.onCaptureSuccess(image);
       
}
       
@Override
       
public void onError(@NonNull ImageCaptureException exception) {
           
super.onError(exception);
       
}
   
});
}
 
CameraX version tested on: beta04 and beta05.

As seen in the code, I'm closing the image. Still, it did not solve the issue. Tested and got the same behavior on 3 different phones. 

Message has been deleted

LINGA venkatesh

unread,
Jun 14, 2020, 1:22:52 PM6/14/20
to Android CameraX Discussion Group
I have got similar error/crash:

2020-06-12 19:15:20.758 30250-30693/com.microsoft.office.lens.app E/AndroidRuntime: FATAL EXCEPTION: CameraX-camerax_high_priority
Process: com.microsoft.office.lens.app, PID: 30250
java.lang.IllegalStateException: maxImages (4) has already been acquired, call #close before acquiring more.
at android.media.ImageReader.acquireNextImage(ImageReader.java:402)
at android.media.ImageReader.acquireLatestImage(ImageReader.java:287)
at androidx.camera.core.AndroidImageReaderProxy.acquireLatestImage(AndroidImageReaderProxy.java:56)
at androidx.camera.core.SafeCloseImageReaderProxy.acquireLatestImage(SafeCloseImageReaderProxy.java:64)
at androidx.camera.core.ImageAnalysisNonBlockingAnalyzer.onImageAvailable(ImageAnalysisNonBlockingAnalyzer.java:66)
at androidx.camera.core.SafeCloseImageReaderProxy.lambda$setOnImageAvailableListener2SafeCloseImageReaderProxy(SafeCloseImageReaderProxy.java:168)
at androidx.camera.core.-$$LambdaSafeCloseImageReaderProxyxYazVewXZg9bKXr5ULxlN6BNF-8.onImageAvailable(lambda)
at androidx.camera.core.AndroidImageReaderProxy$11.run(AndroidImageReaderProxy.java:145)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)

Regards,
Venkatesh.

Leo Huang

unread,
Jun 29, 2020, 1:51:14 AM6/29/20
to Android CameraX Discussion Group, l.venk...@gmail.com
Hi Prajwal,

Thank you for reporting this bug. I am trying to reproduce it by the sample app you provide (https://github.com/prajwal-bhat/CameraX) but unable to reproduce it on current devices I have (about 6-8 devices).
May I know what devices do you use to test? (device model and API level)
Are there certain steps to reproduce it?

P.s I add one log entry in the first line of onCaptureSuccess() callback. Launch app, click take picture button several times in a row and check the log to see if the callback come.

commit c5c8c26f936de87146ad9bb9227f3e66205fceaa
MainActivity.java, line: 349
public void onCaptureSuccess(@NonNull ImageProxy image) {
    Log.d("Test", "onCaptureSuccess : " + image);

    Bitmap imageBitmap = rotateImage(imageToBitmap(Objects.requireNonNull(image.getImage())), image.getImageInfo().getRotationDegrees());
    ...
}

Leo
l.venk...@gmail.com 在 2020年6月15日 星期一上午1:22:52 [UTC+8] 的信中寫道:

Leo Huang

unread,
Jun 29, 2020, 2:57:06 AM6/29/20
to Android CameraX Discussion Group, Leo Huang, l.venk...@gmail.com
Hi Venkatesh,

The crash you meet should be another issue on ImageAnalysis. See https://issuetracker.google.com/160105061.


2020-06-12 19:15:20.758 30250-30693/com.microsoft.office.lens.app E/AndroidRuntime: FATAL EXCEPTION: CameraX-camerax_high_priority
Process: com.microsoft.office.lens.app, PID: 30250
java.lang.IllegalStateException: maxImages (4) has already been acquired, call #close before acquiring more.
at android.media.ImageReader.acquireNextImage(ImageReader.java:402)
at android.media.ImageReader.acquireLatestImage(ImageReader.java:287)
at androidx.camera.core.AndroidImageReaderProxy.acquireLatestImage(AndroidImageReaderProxy.java:56)
at androidx.camera.core.SafeCloseImageReaderProxy.acquireLatestImage(SafeCloseImageReaderProxy.java:64)
at androidx.camera.core.ImageAnalysisNonBlockingAnalyzer.onImageAvailable(ImageAnalysisNonBlockingAnalyzer.java:66)
at androidx.camera.core.SafeCloseImageReaderProxy.lambda$setOnImageAvailableListener2SafeCloseImageReaderProxy(SafeCloseImageReaderProxy.java:168)

Leo
Leo Huang 在 2020年6月29日 星期一下午1:51:14 [UTC+8] 的信中寫道:
Reply all
Reply to author
Forward
0 new messages