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

3
我有下面这段代码。
@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个回答

2

你需要尝试关闭CameraCaptureSession而不是Camera。你可以通过cameraCaptureSessions.close()来实现。

然后,你可以创建一个新的session。

你收到了一个异常,因为当你关闭了CameraCaptureSession时,Camera变成了null。


我稍微修正了语法。如果这是预期的意思,请告诉我。 - user1531971

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接