¿Cómo tomar un tiempo hasta que el enfoque se está configurando en la imagen y que tomar una foto?

Trabajo con cámara 2 API.

Utilizo la muestra estándar de google para la cámara.

Problema es el código permite al usuario tomar una imagen incluso si la imagen no está en un foco …

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; } } } }; 

Es la devolución de llamada estándar

Cómo puedo implementar smth como en una cámara normal, cuando el usuario haga clic en tomar el botón de imagen, la primera cámara tomar un enfoque y sólo después de que tomar una foto …

Pero en mi caso, incluso si la imagen no en un enfoque de todos modos es permitir tomar una foto …

¿Qué estoy haciendo mal?

EDITAR

 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

Tal vez no tengo que permitir al usuario tomar una foto si el enfoque no se configura? Significa que debo seguir la condición del foco cada momento y eventual cuando el tecleo del usuario toma el botón de la imagen yo debe comprobar la condición del foco y si está en foco – toma la imagen, si no – demuestre Toast - set up focus

He encontrado recorte de código de acuerdo con esta pregunta

 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); } }; 

Y me enfrenté a tal caso result.get (CaptureResult.CONTROL_AF_STATE); siempre devuelve 0 … 0 es CaptureResult.CONTROL_AF_STATE_INACTIVE. Me enfrenté a la prueba en Samsung S5 … Pero el mismo código siempre vuelve 1 o 2 en Meizu MX5 … ¿Cuál es la diferencia?

¿Qué estoy haciendo mal?

¿Cómo puedo tomar una foto sólo cuando la cámara está enfocada?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.