如何在拍照前检查相机是否聚焦在某物上?
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没有更好的了。
在我的相机应用程序中,我将相机对焦模式设置为 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没有更好的了。