如何在拍照前检查相机是否聚焦在某物上?

how to check if camera is focused on something before taking picture?

在我的相机应用程序中,我将相机对焦模式设置为 FOCUS_MODE_AUTO,并且我还实现了触摸对焦。当用户按下拍摄按钮时,我需要检查相机是否已经聚焦在某物上(通过触摸)或者在拍照之前不调用 Camera.autoFocus() 。我该怎么做?

if (/* how to check ??? */) {
    mCamera.autoFocus(new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
        mCamera().takePicture(null, null, jpegCallback);
        }
    });
}
else {
    mCamera().takePicture(null, null, jpegCallback);
}

试试这个:

mCamera.autoFocus(new Camera.AutoFocusCallback() {
    @Override
    public void onAutoFocus(boolean success, Camera camera) {
       if(success) {
           mCamera().takePicture(null, null, jpegCallback);
       } else {
            //NOT YET FOCUSED
       }
    }
});

编辑

boolean isManualFocused = false;
mCameraPreview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        isManualFocused = true;
        return false;
    }
});
if (!isManualFocused) {
  mCamera.autoFocus(new Camera.AutoFocusCallback() {
     @Override
     public void onAutoFocus(boolean success, Camera camera) {
       mCamera().takePicture(null, null, jpegCallback);
     }
  });
}
else {
  mCamera().takePicture(null, null, jpegCallback);
}

编辑 2:

您可以监听NOT_FOCUSED_LOCKED等事件来检测案件(所有事件请参考:https://developer.android.com/reference/android/hardware/camera2/CaptureResult.html

示例代码:

私有 CameraCaptureSession.CaptureCallback mCaptureCallback = 新 CameraCaptureSession.CaptureCallback() {

private void process(CaptureResult result) {
    switch (mState) {
        case STATE_PREVIEW: {
             int state = result.get(CaptureResult.NOT_FOCUSED_LOCKED);
        }
    }
}

如果您使用FOCUS_MODE_AUTO,您基本上必须在每张照片前触发自动对焦;在该模式下,除非您主动 运行 自动对焦,否则镜头不会移动,并且自动对焦系统不会在 autofocus() 调用之外监控对焦质量。

如果您使用FOCUS_MODE_CONTINUOUS_PICTURE,那么自动对焦系统将尝试始终保持自动对焦well-focused。您可以使用 AutoFocusMove 回调来监视焦点扫描何时开始和停止;不幸的是,不能保证当焦点扫描停止时,场景就在焦点上。

扫描也可能会停止,因为设备放弃并且无法聚焦当前场景。例如,如果场景离相机太近而无法对焦,或者光线不足,就会发生这种情况。

不幸的是,老相机API没有更好的了。