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

4

2 回答 2

7

看来这是图书馆的问题,这是错误: https ://issuetracker.google.com/issues/140518887

更新 根据团队对问题的评论,这似乎不是一个错误,问题是我必须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();
   }
});
于 2019-09-06T18:55:15.563 回答
1

现象问题:

连续两次调用mImageCapture.takePicture()后,再次调用mImageCapture.takePicture()没有任何反应。如果退出,会进入onError回调,表示找不到摄像头。

在这种情况下,你会发现控制台有两条消息如下:

D/ImageCapture:发送图像捕获请求 [current, pending] = [0, 1]。

W/ImageCapture:获取的图像过多。关闭图像以便处理下一个图像。

原因:

捕获的图像太多,必须关闭才能运行。然后,查看ImageCapture的源码,搜索imageProxy.close(),发现有四个地方:抓拍时调用了两个地方,此时判断没有调用两个地方,也就是没有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

于 2021-10-13T11:18:42.780 回答