无法切换相机,无论是否有释放都无法正常工作

时间:2013-09-03 08:38:09

标签: android camera android-camera native release

我有一个使用原生相机的应用程序,我需要制作一个视频,然后切换相机,并再制作一个附加它们。 问题是如果我释放相机然后,当我录制第二个视频时它说:发布后不能调用方法()。如果我不释放相机,那么当更换第二台相机时,它会说:无法连接到相机服务。

这是切换相机的功能:

 cameraFlipButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (recording) {
                    wasrecording = true;
                }
                LogService.log(TAG, "--------------SWITCH CAMERA PRESSED");
                LogService.log(TAG, "Camera: " + mCameraDevice.getCamera().getParameters() + "camera id: " + mCameraId);
                if (mCameraId == 0) {
                    mCameraId = 1;
                    mCurrentModule.mPendingSwitchCameraId = 1;
                } else if (mCameraId == 1) {
                    mCameraId = 0;
                    mCurrentModule.mPendingSwitchCameraId = 0;
                }
                if (recording) {
                    recording = false;
                    recordButton.setImageResource(R.drawable.shutter);
                    if (timer != null) {
                        LogService.log(TAG, "---------------Timer2: " + timer);
                        timer.cancel();
                        timer.purge();
                    }
                    timer = null;
                    Handler han = new Handler();
                    han.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            mCurrentModule.switchCamera();

                        }
                    }, 200);

                } else {
                    mCurrentModule.switchCamera();
                }
            }
        });

这是我的相机管理员切换相机的功能(mCurrentModule.switchCamera()):

public void switchCamera() {
    if (mPaused)
        return;

    Log.i(TAG, "MAMAMAMAMAMAM Start to switch camera. VIDEO MODULE (switchCamera)");
    mCameraId = mPendingSwitchCameraId;
    mPendingSwitchCameraId = -1;
    setCameraId(mCameraId);
    Log.i(TAG, "MAMAMAMAMAMAM after settting camera id VIDEO MODULE (switchCamera)");

    CameraHolder.instance().release();
    Log.i(TAG, "MAMAMAMAMAMAM after release VIDEO MODULE (switchCamera)");
    videoFragment.mCameraDevice = null;
    mPreviewing = false;
    Log.i(TAG, "MAMAMAMAMAMAM before open camera VIDEO MODULE (switchCamera)");
    openCamera();
    Log.i(TAG, "MAMAMAMAMAMAM after open camera VIDEO MODULE (switchCamera)");
    getDesiredPreviewSize();
    Log.i(TAG, "MAMAMAMAMAMAM after get desired size VIDEO MODULE (switchCamera)");
    startPreview();
    Log.i(TAG, "MAMAMAMAMAMAM after start preview VIDEO MODULE (switchCamera)");
    resizeForPreviewAspectRatio();
    Log.i(TAG, "MAMAMAMAMAMAM before handler VIDEO MODULE (switchCamera)");
    if (ApiHelper.HAS_SURFACE_TEXTURE) {
        // Start switch camera animation. Post a message because
        // onFrameAvailable from the old camera may already exist.
        mHandler.sendEmptyMessage(SWITCH_CAMERA_START_ANIMATION);
    }
}
来自此函数的

CameraHolder.instance().release();调用处理程序来释放执行此操作的摄像机:

public synchronized void release() {

    if (mCameraDevice == null)
        return;

    mCameraOpened = false;
    mCameraDevice.release();
    mCameraDevice = null;
    // We must set this to null because it has a reference to Camera.
    // Camera has references to the listeners.
    mParameters = null;
    mCameraId = -1;
}

释放后我再次打开相机:

public synchronized CameraProxy open(int cameraId) throws CameraHardwareException {
    // Log.i(TAG,
    // "MAMAMAMAMAMAM before release from open CAMERA HOLDER open() CameraProxy");
    if (mCameraOpened) {
        Log.i(TAG, "MAMAMAMAMAMAM before release CAMERA OPENED CAMERA HOLDER open() CameraProxy ");
        mCameraDevice.release();
    }
    if (mCameraDevice != null) {
        Log.i(TAG, "MAMAMAMAMAMAM before release from open mCameraId != cameraId CAMERA HOLDER open() CameraProxy");
        mCameraDevice.release();
        mCameraDevice = null;
        mCameraId = -1;
    }
    if (mCameraDevice == null) {
        try {
            Log.i(TAG, "MAMAMAMAMAMAM open camera " + cameraId);
            if (mMockCameraInfo == null) {
                mCameraDevice = CameraManager.instance().cameraOpen(cameraId);
            } else {
                if (mMockCamera == null)
                    throw new RuntimeException();
                mCameraDevice = mMockCamera[cameraId];
            }
            mCameraId = cameraId;
        } catch (RuntimeException e) {
            Log.e(TAG, "fail to connect Camera", e);
            throw new CameraHardwareException(e);
        }
        mParameters = mCameraDevice.getParameters();
    } else {
        try {
            mCameraDevice.reconnect();
        } catch (IOException e) {
            Log.e(TAG, "reconnect failed.");
            throw new CameraHardwareException(e);
        }
        mCameraDevice.setParameters(mParameters);
    }
    mCameraOpened = true;
    mHandler.removeMessages(RELEASE_CAMERA);
    mKeepBeforeTime = 0;
    return mCameraDevice;
}

在此之后我得到屏幕的大小,设置预览等。 之后,如果我再次按下录制按钮,它将崩溃“释放后无法调用方法()”。现在如果我不释放,它会在切换相机时崩溃,因为它无法连接到相机服务。有没有解决的办法?我如何让它释放相机并仍然设法记录?

1 个答案:

答案 0 :(得分:0)

在切换相机功能中,在openCamera();通话后,我再次初始化录音机,用此:

recorderHelper.init(videoFragment.mCameraDevice.getCamera(), mPreviewSurfaceView.getHolder());

现在它有效,我设法改变相机并记录。