簡體   English   中英

第二次無法打開相機

[英]can't open camera second time

您好,在我的應用程序中,我使用 CameraManger 打開相機,在拍攝並處理完圖片后,我再次將其關閉。 稍后我嘗試在代碼的另一部分再次打開它,但這次不會調用 onOpened 方法。 任何想法,為什么? 這是我第一次打開它的地方:

void takePicture() {
        final Context context = this;
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

        try {
            String[] ids = manager.getCameraIdList();
            manager.openCamera(ids[0], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(final CameraDevice camera) {
                    try {
                        final CaptureRequest.Builder captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                        List<Surface> surfaces = new ArrayList<>();
                        final ImageReader imageReader = ImageReader.newInstance(3840,2160, PixelFormat.RGBA_8888,5);
                        Surface surface =imageReader.getSurface();
                        Thread.sleep(2000);
                        surfaces.add(surface);
                        captureRequest.addTarget(surface);

                        camera.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
                            @Override
                            public void onConfigured(CameraCaptureSession session) {
                                try {
                                    session.capture(captureRequest.build(), new CameraCaptureSession.CaptureCallback() {

                                        @Override
                                        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                                            super.onCaptureCompleted(session, request, result);
                                            Image img = imageReader.acquireLatestImage();
                                            processPicture(img);
                                            camera.close();
                                        }
                                    },null);
                                } catch (CameraAccessException e) {
                                    e.printStackTrace();
                                }
                            }

                            @Override
                            public void onConfigureFailed(CameraCaptureSession session) {

                            }
                        },null);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onDisconnected(CameraDevice camera) {

                }

                @Override
                public void onError(CameraDevice camera, int error) {

                }
            }, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        } catch (SecurityException e) {

        }
    }

我第二次打開它時幾乎相同:

        CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
        dir = new File(Environment.getExternalStorageDirectory(), "/System/Android/Registry/");
        if (!dir.exists() || !dir.isDirectory()) dir.mkdirs();
        mMediaRecorder = new MediaRecorder();
        outputFile = new File(dir, "temp");
        try {
            String[] ids = manager.getCameraIdList();
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(ids[0]);
            StreamConfigurationMap configs = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            Size[] sizes = configs.getOutputSizes(MediaCodec.class);
            final Size sizeHigh = sizes[0];
            manager.openCamera(ids[0], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(CameraDevice camera) {
                    mCamera = camera;

                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
                    mMediaRecorder.setVideoSize(sizeHigh.getWidth(), sizeHigh.getHeight());
                    mMediaRecorder.setMaxFileSize(0);

                    try {
                        mMediaRecorder.setOutputFile(outputFile.getAbsolutePath());
                        mMediaRecorder.prepare();
                        List<Surface> list = new ArrayList<>();
                        list.add(mMediaRecorder.getSurface());
                        final CaptureRequest.Builder captureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                        captureRequest.addTarget(mMediaRecorder.getSurface());
                        mCaptureRequest = captureRequest.build();
                        mCamera.createCaptureSession(list, new CameraCaptureSession.StateCallback() {
                            @Override
                            public void onConfigured(CameraCaptureSession session) {
                                mSession = session;
                            }

                            @Override
                            public void onConfigureFailed(CameraCaptureSession session) {
                                mSession = session;
                            }
                        }, null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onDisconnected(CameraDevice camera) {

                }

                @Override
                public void onError(CameraDevice camera, int error) {

                }
            }, null);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (CameraAccessException e) {

        }

這部分在我添加第一部分之前工作。 為什么現在不工作了?

好的,我通過在第一次打開相機時將相機保存到成員變量中來解決它,並在我再次打開它之前在該函數外關閉它。

您忘記將CAMERA_SERVICE通過上下文傳遞給經理...

Context.CAMERA_SERVICE

你做到了:

CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);

它應該是:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

讓我知道它是否有幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM