user3360601
user3360601

Reputation: 347

How to close camera on Android 5.0 API 21?

I have such code below.

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();

        openCamera();
}

private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {
            //This is called when the camera is open
            Log.e(TAG, "onOpened");
            cameraDevice = camera;
            createCameraPreview();
            //closeCamera();
        }

        @Override
        public void onDisconnected(CameraDevice camera) {
            Log.e(TAG, "onDisconnected");
            //cameraDevice.close();
        }

        @Override
        public void onError(CameraDevice camera, int error) {
            Log.e(TAG, "onError");
            cameraDevice.close();
            cameraDevice = null;
        }
    };

private void openCamera() {
        manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        Log.e(TAG, "is camera open");
        try {
            cameraId = manager.getCameraIdList()[0];
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            assert map != null;
            imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
            manager.openCamera(cameraId, stateCallback, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        Log.e(TAG, "openCamera X");
    }

private void closeCamera() {
        Log.e(TAG, "closeCamera start");
        if (null != cameraDevice) {
            cameraDevice.close();
            cameraDevice = null;
        }
        if (null != imageReader) {
            imageReader.close();
            imageReader = null;
        }
    }

 protected void createCameraPreview() {
        Log.e(TAG, "createCameraPreview start");
        if (null != cameraDevice) {
            try {
                SurfaceTexture texture = new SurfaceTexture(1);
                assert texture != null;
                texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
                Surface surface = new Surface(texture);

                if (null == cameraDevice) {
                    Log.e(TAG, "cameraDevice is null");
                    return;
                }

                captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                captureRequestBuilder.addTarget(surface);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
            Log.e(TAG, "createCameraPreview exit");
            takePicture();
        }

    }

After camera opened, I prepare camera and then taking a picture. But method public void onOpened(CameraDevice camera); loops and camera prepares every second. So, how to close CameraManager to stop looping method public void onOpened(CameraDevice camera);?

If I try to close camera with method private void closeCamera(); after taking a picture, CameraManager still works, method onOpened still loops and I get an exception. Sometimes exception says that camera already closed, sometimes that I try to get a null pointer.

I guess that camera after each capturing photo closes and creates a new pointer to camera.

How to stop it?

Upvotes: 3

Views: 4552

Answers (1)

Sergio Sánchez
Sergio Sánchez

Reputation: 71

You have to try close CameraCaptureSession instead of Camera. You can do this via cameraCaptureSessions.close()

Then you can create a new session.

You received an exception because when you closed the CameraCaptureSession the Camera is null.

Upvotes: 2

Related Questions