在我的相机应用程序中,我将相机对焦模式设置为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);
}
答案 0 :(得分:0)
试试这个:
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);
}
EDIT2:
您可以收听NOT_FOCUSED_LOCKED等事件来检测案例(请参阅所有事件:https://developer.android.com/reference/android/hardware/camera2/CaptureResult.html)
示例代码:
私人CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback(){
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
int state = result.get(CaptureResult.NOT_FOCUSED_LOCKED);
}
}
}
答案 1 :(得分:0)
如果你正在使用FOCUS_MODE_AUTO,你基本上必须在每张图片之前触发AF;在该模式下,除非您正在主动运行自动对焦,否则镜头不会移动,并且自动对焦系统不会在自动对焦()调用之外监控对焦质量。
如果您使用FOCUS_MODE_CONTINUOUS_PICTURE,那么AF系统将始终尝试保持AF聚焦。您可以使用AutoFocusMove回调来监控焦点扫描何时开始和停止;遗憾的是,当焦点扫描停止时,无法保证场景处于焦点。
扫描也可以停止,因为设备放弃了,无法对当前场景进行聚焦。例如,如果场景距离相机太近而无法聚焦,或者光线不足,则可能发生这种情况。
不幸的是,旧的相机API没有更好的东西。