如何在完成后重新打开 activity 并在其中再次启动相机预览

How to re open an activity after finishing it and also start the Camera Preview again in it

在我的相机应用程序启动器 activity 中名为 CameraActivity 我已经重写了 onPause() 方法,如下所示,

@Override
protected void onPause() {
    super.onPause();
    mCamera.release();
    finish();
}

因此,每当通过按主页按钮或后退按钮退出应用程序时,相机就会被释放并且 activity 完成以让其他相机应用程序访问相机。但现在我创建了另一个 activity,名为 CameraSettings。并使用 Intent 打开它。问题是当我想返回 CameraActivity 应用程序关闭并 returns 回到主屏幕时,因为我在 onPause() 中使用了 finish() 方法。即使我不使用 finish() 方法,我仍然会出错,因为相机已经被释放。

我想要的是,当我在 CameraActivity 时,如果我按 back/home 则相机将被释放,如果我转到 CameraSettings activity ,在对相机进行更改后,我想返回 CameraActivity,这将重新打开相机以供使用。我尝试覆盖 onResume() 方法并再次启动相机预览,但它给出了错误。下面是onResume()方法,

@Override
protected void onResume() {
    super.onResume();
    mCamera.startPreview();
}

这是我的 onCreate() 第一次启动相机预览的方法,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_test);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    //ShutterSound
    final Camera.ShutterCallback shutter = new Camera.ShutterCallback() {
        @Override
        public void onShutter() {

        }
    };

    //Settings listener
    settings = (ImageView) findViewById(R.id.settings);
    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent openSettings = new Intent(getApplicationContext(),CameraSettings.class);
            startActivity(openSettings);
        }
    });



    //Capture button listener
    captureButton = (Button) findViewById(R.id.captureButton);
    captureButton.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    captureButton.setEnabled(false);
                    // get an image from the camera
                    mCamera.takePicture(shutter, null, mPicture);
                }
            }
    );

    //Switch the cameras
    switchCamera = (ImageView) findViewById(R.id.switchCamera);
    switchCamera.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            checkFrontCameraInUse = !checkFrontCameraInUse;
            switchCamera.setEnabled(false);
            switchCamera();
        }
    });

    /*
    * Below code is
    * needed to start the camera first time
    * */

    // Create an instance of Camera
    mCamera = CameraInstance.getCameraInstance(0);
    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera, 0);
    preview = (LinearLayout) findViewById(R.id.camera_preview);

    assert preview != null;
    preview.addView(mPreview);
}

这是错误信息,

    FATAL EXCEPTION: main
    Process: com.prohelika.testcamera, PID: 28304
    java.lang.RuntimeException: Camera is being used after Camera.release() was called
    at android.hardware.Camera.setPreviewSurface(Native Method)
    at android.hardware.Camera.setPreviewDisplay(Camera.java:801)
    at com.prohelika.testcamera.CameraPreview.surfaceCreated(CameraPreview.java:36)
    at android.view.SurfaceView.updateWindow(SurfaceView.java:675)
    at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:273)
    at android.view.View.dispatchWindowVisibilityChanged(View.java:8998)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1190)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1575)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1296)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6602)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800)
    at android.view.Choreographer.doCallbacks(Choreographer.java:603)
    at android.view.Choreographer.doFrame(Choreographer.java:572)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:786)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5717)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

如果我的解释不好请见谅。

由于您已经释放了相机资源,因此在 onResume() 方法中调用 startPreview() 方法时出现错误。

释放后将camera设置为null。 并从相机预览中删除 previewCallback

    @Override
    protected void onPause() {
        super.onPause();
        mCamera.setPreviewCallback(null);
        mPreview.getHolder().removeCallback(mPreview);
        mCamera.release();
        mCamera = nulll
        finish();
    }

尝试检查相机是否为 null 并在 onResume() 方法中如下重新初始化您的 camera 实例:

@Override
protected void onResume() {
    super.onResume();
    if (mCamera == null) {
        mCamera = getCameraInstance();
    }
    mCamera.startPreview();
}

P.S. 如果 null.

您可能需要重新初始化预览

希望对您有所帮助!