Как потратить время на настройку фокуса на изображение и чем сфотографировать? Camera2API
Я работаю с камерой 2 API.
Я использую стандартный пример Google для камеры.
Проблема в том, что код позволяет пользователю делать снимок, даже если изображение не в фокусе ...
private final CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureProgressed(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull CaptureResult partialResult) {
}
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
process(result);
}
private void process(CaptureResult result) {
switch (mState) {
case CameraHelper.STATE_PREVIEW: {
// We have nothing to do when the camera preview is working normally.
break;
}
case CameraHelper.STATE_WAITING_LOCK: {
Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (afState == null) {
captureStillPicture();
} else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
mState = CameraHelper.STATE_PICTURE_TAKEN;
captureStillPicture();
} else {
runPrecaptureSequence();
}
}
break;
}
case CameraHelper.STATE_WAITING_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
mState = CameraHelper.STATE_WAITING_NON_PRECAPTURE;
}
break;
}
case CameraHelper.STATE_WAITING_NON_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
mState = CameraHelper.STATE_PICTURE_TAKEN;
captureStillPicture();
}
break;
}
}
}
};
Это стандартный обратный звонок
Как я могу реализовать что-то, как в обычной камере, когда пользователь нажимает кнопку съемки, первая камера фокусируется и только после этого делает снимок ...
Но в моем случае, даже если картинка не в фокусе, в любом случае это позволяет сделать снимок ...
Что я делаю неправильно?
РЕДАКТИРОВАТЬ
private void captureStillPicture() {
try {
if (null == cameraDevice) {
return;
}
// This is the CaptureRequest.Builder that we use to take a picture.
final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(imageReader.getSurface());
captureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte) 100);
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(captureBuilder);
// Orientation
int rotation = getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, CameraHelper.ORIENTATIONS.get(rotation));
// Этот метод показывает, что будет происходить после того как снимок будет сделан
final CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
Logger.logGeneral("LENS_FOCAL_LENGTH : " + request.get(CaptureRequest.LENS_FOCAL_LENGTH));
unlockFocus();
}
};
captureSession.stopRepeating();
captureSession.capture(captureBuilder.build(), CaptureCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
EDIT2
Может быть, мне не нужно позволять пользователю делать снимки, если фокус не настроен? Это означает, что я должен отслеживать состояние фокуса каждый момент и в конце концов, когда пользователь нажимаетсделать фотографию кнопку я должен проверить состояние фокуса и если он в фокусе - сделать снимок, если нет - показатьToast - set up focus
я нашел фрагмент кода в соответствии сэтот вопрос
private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_TRIGGER_START == afState) {
if (areWeFocused) {
//Run specific task here
}
}
if (CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState) {
areWeFocused = true;
} else {
areWeFocused = false;
}
break;
}
}
}
@Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
CaptureResult partialResult) {
process(partialResult);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
process(result);
}
};
И я столкнулся с таким случаем result.get (CaptureResult.CONTROL_AF_STATE); всегда возвращайте 0 ... 0 это CaptureResult.CONTROL_AF_STATE_INACTIVE. Я сталкивался с этим тестированием на Samsung S5 ... Но один и тот же код всегда возвращает 1 или 2 на Meizu MX5 ... В чем разница?
Что я делаю неправильно?
Как я могу сделать снимок, только когда камера в фокусе?