如何解决android onImageAvailableListener调用了两次
我面临一个无法解决的问题,每当我按下“捕获图像”按钮并请求相机进行静态图像捕获时,我的onImageAvailableListener
被调用两次,并导致图像变为保存两次在设备中,提供正在运行的代码示例
按下按钮时,lockFocus()
被称为:
private void lockFocus(){
mCaptureState = STATE_AF_WAIT_LOCK;
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
try {
mPreviewCaptureSession.capture(mCaptureRequestBuilder.build(),mPreviewCaptureCallback,mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
我的mPreviewCaptureCallback
:
private CameraCaptureSession.CaptureCallback mPreviewCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureFailed(@NonNull CameraCaptureSession session,@NonNull CaptureRequest request,@NonNull CaptureFailure failure) {
super.onCaptureFailed(session,request,failure);
}
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,@NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session,result);
switch (mCaptureState){
case CAMERA_STATE_PREVIEW:
// do nothing
break;
case STATE_AF_WAIT_LOCK:
mCaptureState = CAMERA_STATE_PREVIEW;
int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED){
startStillCaptureRequest();
break;
}
}
}
};
startStillCaptureRequest()
:
private void startStillCaptureRequest(){
try {
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
mCaptureRequestBuilder.addTarget(mImageReader.getSurface());
CameraCaptureSession.CaptureCallback stillCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureStarted(@NonNull CameraCaptureSession session,long timestamp,long frameNumber) {
super.onCaptureStarted(session,timestamp,frameNumber);
try {
latestImageFile = createImageFileName();
} catch (IOException e) {
e.printStackTrace();
}
}
};
mPreviewCaptureSession.capture(mCaptureRequestBuilder.build(),stillCaptureCallback,null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
和我的onImageAvailbleListener
:
private final ImageReader.OnImageAvailableListener mOnImageAavailableListner = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(),mImageFileName));
}
};
我尝试添加一个新状态,该状态会在拍摄一张照片后更改,然后像这样关闭另一张照片,但是我敢肯定,有一种更优雅的处理方式:
if (mCaptureState != STATE_PICTURE_TAKEN){
mCaptureState = STATE_PICTURE_TAKEN;
mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(),mImageFileName));
else {
reader.acquireLatestImage().close();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。