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

How to close camera on Android 5.0 API 21?

我下面有这样的代码。

@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 仍然循环,我得到一个异常。有时异常说相机已经关闭,有时我试图获得一个空指针。

我猜相机在每次拍摄照片后都会关闭并创建一个指向相机的新指针。

如何停止?

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

执行此操作

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

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