Search code examples
androidapicamerasetfocus

Android Camera Api 2 Manual focus with touch


I want to to make camera app with touch focus, but i am little confused with the camera api 2. I have read about LENS_FOCUS_DISTANCE but i don't understand how to use it. Can you please assist?

Thank you in advance and wish you nice weekend!


Solution

  • Camera API2 looks weird for begin, but then you will see that it's pretty easy.

    Best answer for this question is code with comments:

    private void captureImage() {
        try {
            //for do this you should have mCameraDevice and mCameraCaptureSession
    
            //get CaptureRequestBuilder.
            captureStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
    
            //add target surfaces - for getting image data you should have instance on ImageReader
            //with OnImageAvailableListener that will be called when image will be captured
            //but for showing on screen you have to use SurfaceView or TextureView
            captureStillBuilder.addTarget(mImageReader.getSurface());
    
            //add some details for Request
            //in general: you have fields and values for it and you just set what value should be in each field
            // auto focus works only when whole control mode in auto
            captureStillBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
            // before capture lock focus
            captureStillBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                    CaptureRequest.CONTROL_AF_TRIGGER_START);
            // set area for focusing
            MeteringRectangle[] focusArea = new MeteringRectangle[1];            
            focusArea[0] = new MeteringRectangle(/*here set coordinates for focus on */);
            captureStillBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, focusArea);
    
            // create callback for this capture
            CameraCaptureSession.CaptureCallback callback = new ...
            // just run capture to make focused photo
            mCameraCaptureSession.capture(captureStillBuilder.build(), callback, null);
    
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }