首页 > 解决方案 > 每当我尝试调用它时,Camera.release() 都无法在代码中工作

问题描述

我有这段代码,它第一次获取参数,但是当我尝试恢复活动或使用意图再次启动活动时,应用程序崩溃。我试图在我的代码的不同部分释放相机,但它似乎不起作用。这是表面更改的代码

    private SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

        /**
         * {@inheritDoc}
         */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                mCamera.setPreviewDisplay(previewHolder);
                mCamera.setPreviewCallback(previewCallback);
            } catch (Throwable t) {
                Log.e("MotionDetector", "Exception in setPreviewDisplay()", t);
            }
//            try {
//                if(!mInitSuccesful)
//                    initRecorder(previewHolder.getSurface());
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {


            Camera.Parameters parameters = mCamera.getParameters();
            List<String> focusModes = parameters.getSupportedFocusModes();
            if (focusModes.contains(parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
                parameters.setFocusMode(parameters.FOCUS_MODE_CONTINUOUS_PICTURE);

            Camera.Size size = getBestPreviewSize(width, height, parameters);
            if (size != null) {
                parameters.setPreviewSize(size.width, size.height);
                Log.d("MotionDetector", "Using width=" + size.width + " height=" + size.height);
            }
            mCamera.setDisplayOrientation(90);
            mCamera.setParameters(parameters);
            mCamera.startPreview();


            inPreview = true;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // Ignore
            mCamera.stopPreview();
            releaseCamera();
        }

我有这个代码。在表面被破坏时,我调用了停止预览并释放相机,但不断收到标题中提到的错误。注意:第一次运行平稳,但如果我按回并再次打开活动,则会出现错误

错误似乎在此代码中

    @Override
        public void run() {
            while (isRunning.get()) {
                long now = System.currentTimeMillis();
                if (now - lastCheck > checkInterval) {
                    lastCheck = now;

                    if (nextData.get() != null) {
                        int[] img = ImageProcessing.decodeYUV420SPtoLuma(nextData.get(), nextWidth.get(), nextHeight.get());

                        // check if it is too dark
                        int lumaSum = 0;
                        for (int i : img) {
                            lumaSum += i;
                        }
                        if (lumaSum < minLuma) {
                            if (motionDetectorCallback != null) {
                                mHandler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        motionDetectorCallback.onTooDark();
                                    }
                                });
                            }
                        } else if (detector.detect(img, nextWidth.get(), nextHeight.get())) {
                            // check
                            if (motionDetectorCallback != null) {
                                mHandler.post(new Runnable() {
                                    @Override
                                    public void run() {

                                            Camera.Parameters params = imgCam.getParameters();
                                            int w = params.getPreviewSize().width;
                                            int h = params.getPreviewSize().height;
                                            int format = params.getPreviewFormat();
                                            YuvImage image = new YuvImage(imgByte, format, w, h, null);

                                            ByteArrayOutputStream out = new ByteArrayOutputStream();
                                            Rect area = new Rect(0, 0, w, h);
                                            image.compressToJpeg(area, 100, out);
                                            Bitmap bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());


                                            float degrees = 90;//rotation degree
                                            Matrix matrix = new Matrix();
                                            matrix.setRotate(degrees);
                                            bOutput = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);

//                                        mMediaRecorder.start();
//                                        try {
//                                            Thread.sleep(10 * 1000); // This will recode for 10 seconds, if you don't want then just remove it.
//                                        } catch (Exception e) {
//                                            e.printStackTrace();
//                                        }
//                                        getOutputMediaFile(1);
                                            motionDetectorCallback.onMotionDetected();

                                    }
                                });
                            }
                        }
                    }
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

标签: androidnullpointerexceptioncamera

解决方案


使用它来释放相机

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mcamera.stopPreview();
    mcamera.release();
}

在 onCreate METHOD 之后使用它来恢复主要活动中的相机预览:

@Override
public void onResume() {
    super.onResume();
    mCamera = Camera.open();
    mCamera.startPreview();
}

surfaceChanged() 无关。


推荐阅读