¿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.
- Android Studio Error: Error: CreateProcess error = 216, Esta versión de% 1 no es compatible con la versión de Windows que está ejecutando
- Acceso a R.java desde diferentes paquetes
- ActivityCompat.requestPermissions no muestra el diálogo
- Propósito de los parámetros de varianza de AsyncTask
- El emulador Android de Bluestacks está construido usando .Net?
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?
- Error al actualizar TextView desde el método de ejecución de TimerTask
- Instalación de Android Studio para el desarrollo de Android
- ¿Cuál es la diferencia entre DVM y JVM?
- El proyecto de Android no creará al editar un archivo de recursos
- Compartir traducciones entre servidor java, ios y android
- ArrayList Límite para mantener 10 valores
- Actividad que extiende ActionBarActivity y YouTubeBaseActivity
- Android NDK posibilidad de descompilar código nativo