Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Camera 2 - API - Image capturing is not working when using Front Camera?

In my camera app i have a button to change the camera facing in to front or back ,I can capture and save images using back camera ,but when i switch to front camera i could not capture images . This is how i am switching camera to front or back .

   ImageView switch_camera =(ImageView) rootview.findViewById(R.id.imageView7);
        switch_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


         //       facing = characteristics.get(CameraCharacteristics.LENS_FACING);

                if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
                    //isfrontcam=true;
                    try {

                        //manager.openCamera(getBackFacingCameraId(manager), mStateCallback, mBackgroundHandler);
                        closeCamera();
                        openCamera(mTextureView.getWidth(), mTextureView.getHeight(),"0");
                        Log.e("opening ","BackCam");
                        facing = 1;

                    } catch (SecurityException e) {
                        e.printStackTrace();

                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                } else if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) {
                    //  isfrontcam = true;
                    try {
                        //manager.openCamera(getFrontFacingCameraId(manager), mStateCallback, mBackgroundHandler);

                      //  characteristics = manager.getCameraCharacteristics("1");

                        closeCamera();
                        openCamera(mTextureView.getWidth(), mTextureView.getHeight(),"1");

                        Log.e("opening ", "FrontCam");
                        String str = getBackFacingCameraId(manager);
                        facing= 0;
                        Log.e("str", "id" + str);

                    } catch (SecurityException e) {
                        e.printStackTrace();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

On capture button click ,i am calling this function to capture images ;

 private void lockFocus() {
        try {
            // This is how to tell the camera to lock focus.
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                    CameraMetadata.CONTROL_AF_TRIGGER_START);
            // Tell #mCaptureCallback to wait for the lock.
            mState = STATE_WAITING_LOCK;
            mCaptureSession.capture(mPreviewRequestBuilder.build(),mCaptureCallback,
                    mBackgroundHandler);
        } catch (CameraAccessException e) {

            e.printStackTrace();
        }
    }
like image 229
Tom Avatar asked Feb 18 '16 09:02

Tom


People also ask

How do I know if my Camera2 API is enabled on my Android phone?

Well, all you need to do is download a simple app called 'Camera2 API probe' from the Google Play Store and run it. The app gives detailed info about both the rear and front camera sensors of your Android phone. From that info, you can easily deduce whether your Android device supports Camera2 API or not.

What is the use of camera 2 API?

Camera2 is the latest low-level Android camera package and replaces the deprecated Camera class. Camera2 provides in-depth controls for complex use cases, but requires you to manage device-specific configurations. You can read about specific Camera2 classes and functions in the reference documentation.


1 Answers

Check your CameraCaptureSession.CaptureCallback : probably the camera has the state CONTROL_AF_STATE_INACTIVE. And as it is waiting for the focus...the picture will never been taken.

it should be like this

            case 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 ||
                         CaptureResult.CONTROL_AF_STATE_INACTIVE == afState /*add this*/) {
                    // 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 = STATE_PICTURE_TAKEN;
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            }
like image 89
Gigi Avatar answered Oct 21 '22 18:10

Gigi