无法使用 camerax 拍摄多张图像
can't take multiple Images using camerax
我正在尝试使用 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
但 调用 Capture Success 2 拍摄新照片 从未发生过
虽然根据文档拍两张照片并没有错:
TakePicture returns immediately and a listener is called to provide the results after the capture completes. Multiple calls to takePicture will take pictures sequentially starting after the previous picture is captured.
https://developer.android.com/reference/androidx/camera/core/ImageCapture?hl=en
这似乎是库的问题,错误在这里:
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();
}
});
现象问题:
连续调用了两次mImageCapture.takePicture(),再次调用mImageCapture.takePicture()后没有任何反应。如果退出就会进入onError回调,提示找不到摄像头。
在这种情况下,你会发现控制台有如下两条信息:
D/ImageCapture:发送图片采集请求[current, pending] = [0, 1].
W/ImageCapture:获取的图像过多。关闭图片,以便处理下一张图片。
原因:
截取的图片太多,必须关闭到运行下。然后,查看ImageCapture的源码,搜索imageProxy.close(),发现有四个地方:两个地方在捕获时调用,两个地方判断暂时没有调用,即有一般情况下拍完照return成功后没有关闭,所以才会出现这个问题。
解决方案:
在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
我正在尝试使用 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
但 调用 Capture Success 2 拍摄新照片 从未发生过
虽然根据文档拍两张照片并没有错:
TakePicture returns immediately and a listener is called to provide the results after the capture completes. Multiple calls to takePicture will take pictures sequentially starting after the previous picture is captured.
https://developer.android.com/reference/androidx/camera/core/ImageCapture?hl=en
这似乎是库的问题,错误在这里: 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();
}
});
现象问题:
连续调用了两次mImageCapture.takePicture(),再次调用mImageCapture.takePicture()后没有任何反应。如果退出就会进入onError回调,提示找不到摄像头。
在这种情况下,你会发现控制台有如下两条信息:
D/ImageCapture:发送图片采集请求[current, pending] = [0, 1].
W/ImageCapture:获取的图像过多。关闭图片,以便处理下一张图片。
原因:
截取的图片太多,必须关闭到运行下。然后,查看ImageCapture的源码,搜索imageProxy.close(),发现有四个地方:两个地方在捕获时调用,两个地方判断暂时没有调用,即有一般情况下拍完照return成功后没有关闭,所以才会出现这个问题。
解决方案:
在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