【问题标题】:How to close camera on Android 5.0 API 21?如何在 Android 5.0 API 21 上关闭相机?
【发布时间】:2017-08-15 05:06:05
【问题描述】:

我下面有这样的代码。

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

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

如何阻止它?

【问题讨论】:

    标签: java android android-camera2


    【解决方案1】:

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

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

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

    【讨论】:

    • 我稍微修正了语法。让我知道这是否是预期的意思。
    猜你喜欢
    • 2015-02-06
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2020-06-26
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多