Wie lange dauert es, bis der Fokus auf dem Bild liegt und dann ein Bild aufgenommen wird? Camera2API

Ich arbeite mit der Kamera 2-API.

Ich verwende Google-Standardbeispiel für die Kamera.

Ist der Code erlaubt es dem Benutzer, ein Bild aufzunehmen, auch wenn das Bild nicht scharfgestellt ist ...

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 ist Standard-Rückruf

Wie ich smth wie in einer normalen Kamera implementieren kann, wenn der Benutzer auf die Schaltfläche "Bild aufnehmen" klickt, nimmt die erste Kamera einen Fokus auf und macht erst danach ein Bild ...

Aber in meinem Fall, auch wenn das Bild ohnehin nicht scharf ist, ist es erlaubt, ein Bild aufzunehmen ...

Was mache ich falsch

BEARBEITE

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

Vielleicht muss ich dem Benutzer nicht erlauben, ein Bild aufzunehmen, wenn der Fokus nicht eingestellt ist? Es bedeutet, dass ich den Fokuszustand jeden Moment verfolgen sollte und schließlich, wenn der Benutzer auf @ klickein Bild mache button ich sollte den fokuszustand überprüfen und ob er scharf ist - mach ein foto, wenn nicht - zeigeToast - set up focus

Ich habe einen Code-Ausschnitt gemäß @ gefundediese Frag

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

Und ich sah mich mit einem solchen Fall konfrontiert result.get (CaptureResult.CONTROL_AF_STATE); Geben Sie immer 0 ... 0 zurück, es ist CaptureResult.CONTROL_AF_STATE_INACTIVE. Ich habe es mit Tests auf Samsung S5 zu tun gehabt ... Aber derselbe Code gibt auf Meizu MX5 immer 1 oder 2 zurück ... Was ist der Unterschied?

Was mache ich falsch

Wie kann ich ein Bild nur dann aufnehmen, wenn die Kamera scharfgestellt ist?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage