无法使用CameraX拍摄多张图像

4

我正在尝试使用Camerax拍摄多张照片,但只拍摄了第一张照片,代码和日志输出将展示我的意思。

以下是代码:

        Log.d(TAG, "------------------ taking new picture1");
        mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
            @Override
            public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
                Image image = imageProxy.getImage();
                Log.d(TAG, "taking new picture onCapture Success 1 called");
            }

            @Override
            public void onError(ImageCapture.UseCaseError useCaseError, String message, @Nullable Throwable cause) {
                super.onError(useCaseError, message, cause);
                Log.d(TAG, "--------- error in image capture 1" + message);


            }
        });

        Log.d(TAG, "------------------ taking new picture 2");
        mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
            @Override
            public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
                Image image = imageProxy.getImage();
                Log.d(TAG, "taking new picture onCapture Success 2 called");


            }

            @Override
            public void onError(ImageCapture.UseCaseError useCaseError, String message, @Nullable Throwable cause) {
                super.onError(useCaseError, message, cause);
                Log.d(TAG, "--------- error in image capture 2" + message);
            }
        });

相关的日志输出如下:
2019-09-04 12:23:00.978 28970-29006/com.example.david.digified_android D/ScanDocumentFragment: ------------------ taking new picture1
2019-09-04 12:23:00.980 28970-29006/com.example.david.digified_android D/ScanDocumentFragment: ------------------ taking new picture 2
2019-09-04 12:23:02.063 28970-28970/com.example.david.digified_android D/ScanDocumentFragment: taking new picture onCapture Success 1 called

但是,在onCapture Success 2调用时拍摄新照片从未发生。

尽管根据文档,拍摄两张照片并不是错误的:

takePicture立即返回,并调用侦听器以在捕获完成后提供结果。对takePicture的多次调用将从前一个图像捕获完成后开始按顺序连续拍摄多张照片。

https://developer.android.com/reference/androidx/camera/core/ImageCapture?hl=en

2个回答

11

看起来这是一个库的问题,以下是错误信息: https://issuetracker.google.com/issues/140518887

更新: 根据团队的评论,似乎这不是一个 bug,问题在于我需要在处理完成后调用 image.close();,因此我的代码应该是:

Log.d(TAG, "------------------ taking new picture1");
mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
   @Override
   public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
      Image image = imageProxy.getImage();
      Log.d(TAG, "taking new picture onCapture Success 1 called");
      image.close();
   }

});

Log.d(TAG, "------------------ taking new picture 2");
mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
   @Override
   public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
      Image image = imageProxy.getImage();
      Log.d(TAG, "taking new picture onCapture Success 2 called");
      image.close();
   }
});

1
请考虑这样关闭imageProxy --> imageProxy.close(); - yaircarreno

2
现象问题:
调用mImageCapture.takePicture()两次后,再次调用mImageCapture.takePicture()没有响应。如果退出,则会进入onError回调,指示找不到相机。
在这种情况下,您将发现控制台有两条消息如下:
D/ImageCapture: Send image capture request [current, pending] = [0, 1].
W/ImageCapture: Too many images acquired. Close the image so that the next image can be processed.
原因:
捕获的图像太多,必须关闭才能运行下去。然后,查看ImageCapture的源代码并搜索imageProxy.close(),发现有四个位置:两个位置在捕获期间调用,而另外两个位置正在判断时未被调用,即,在正常情况下拍照并成功返回后没有进行关闭操作,因此会导致这个问题。
解决方法:
在mImageCapture.takePicture()的成功回调函数中,在使用完图像后手动关闭它,就可以解决这个问题。
mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener(){
        @Override
        public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
            //Do something
            Log.d(TAG, "taking new picture onCapture Success 1 called");
            imageProxy.close();
        }

        @Override
        public void onError(ImageCapture.UseCaseError useCaseError, String message, @Nullable Throwable cause) {
            super.onError(useCaseError, message, cause);
            Log.d(TAG, "--------- error in image capture 1" + message);


        }
    });

资源: https://blog.csdn.net/qq_37980878/article/details/120060170

这篇文章介绍了IT技术中的三种常见的存储方式:文件系统、数据库和对象存储。文件系统是最简单的一种存储方式,可以通过文件路径来进行访问。数据库则可以更方便地进行数据管理和查询,但需要专业知识进行操作。而对象存储则是一种新兴的存储方式,可以更好地应对海量数据的存储和访问需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接