如何在Android 5.0 API 21上关闭相机?

时间:2016-10-22 21:46:55

标签: java android android-camera2

我在下面有这样的代码。

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

    }

相机打开后,我准备相机,然后拍照。但方法public void onOpened(CameraDevice camera);循环和摄像机每秒准备。那么,如何关闭CameraManager以停止循环方法public void onOpened(CameraDevice camera);

如果我在拍照后尝试用方法private void closeCamera();关闭相机,CameraManager仍然有效,方法onOpened仍然循环,我得到一个例外。有时异常表示相机已经关闭,有时候我会尝试获取空指针。

我想每张拍摄照片后相机会关闭并创建一个指向相机的新指针。

如何阻止它?

1 个答案:

答案 0 :(得分:1)

您必须尝试关闭CameraCaptureSession而不是Camera。您可以通过cameraCaptureSessions.close()

执行此操作

然后你可以创建一个新的会话。

您收到异常,因为当您关闭CameraCaptureSession时,Camera为空。