Java 如何修复从横向切换到反向横向时的反向摄影机预览

Java 如何修复从横向切换到反向横向时的反向摄影机预览,java,android,camera,orientation-changes,Java,Android,Camera,Orientation Changes,我正在将摄像头应用到我的应用程序中。除一件事外,所有功能都正常工作,当将显示器从横向旋转到反向横向时,surfaceview不会更新(从反向横向旋转到正常横向时相同)。不调用surfaceChanged,因此,预览会颠倒显示。如果我将显示器从纵向旋转到横向或反向横向,效果会非常好 我曾尝试在CameraActivity(扩展ActionBarActivity)中使用OnConfiguration Change捕捉到这一点,但在方向从正常方向更改为反向方向(或相反方向)的情况下,不会调用它。我了解

我正在将摄像头应用到我的应用程序中。除一件事外,所有功能都正常工作,当将显示器从横向旋转到反向横向时,surfaceview不会更新(从反向横向旋转到正常横向时相同)。不调用surfaceChanged,因此,预览会颠倒显示。如果我将显示器从纵向旋转到横向或反向横向,效果会非常好

我曾尝试在CameraActivity(扩展ActionBarActivity)中使用OnConfiguration Change捕捉到这一点,但在方向从正常方向更改为反向方向(或相反方向)的情况下,不会调用它。我了解到这是因为在这种情况下没有任何配置会发生实际变化。方向仍然是横向的,屏幕大小不变,因此,OnConfiguration change不被称为

接下来,我决定尝试使用一个OrientationEventListener来实现这一点,但我似乎无法从这个侦听器中访问相机:

mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) {

        @Override
        public void onOrientationChanged(int orientation) {

            // determine our orientation based on sensor response
            int lastOrientation = mOrientation;

            DisplayMetrics displaymetrics = new DisplayMetrics();
            Display display = getWindowManager().getDefaultDisplay();
            int rotation = display.getRotation();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);

            int height = displaymetrics.heightPixels;
            int width = displaymetrics.widthPixels;

            if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
                if (mCamera == null)
                    mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK);

                int angleToRotate = getRoatationAngle();
                mCamera.setDisplayOrientation(angleToRotate);
                initPreview(width, height);
                startPreview();
            }
        }
    };
我一直得到一个NullPointerException,因为每当调用onOrientationChanged时,mCamera都是null。我已经在上面的代码中检查了这个空值,但是当调用Camera.open()时,我的应用程序崩溃了。尝试使用Camera.open()在onOrientationChanged内设置mCamera时发生NullPointerException

我也尝试过从OrientationEventListener中调用surfaceChanged,同样的问题也发生了。当我尝试在surfaceChanged中设置null mCamera变量时,只有NullPointerException发生


有人知道如何解决这个问题吗?

我决定用另一种方式实现它。不再允许“活动”和“预览”方向更改,它们现在都被锁定。使用AndroidManifest.xml在纵向模式下锁定活动,在正常横向模式下锁定预览,当手机旋转时,我使用OrientationEventListener确定旋转角度,并调整输出图像和快门按钮的旋转,使其感觉方向发生了变化,但事实上,活动和预览保持相同的方向


这可以完美地工作,并阻止我实现不必要的代码。此方法还可以消除重新加载活动时方向更改的延迟,因为该活动不再进行方向更改,并且不会调用onCreate()。

但是,对OrientationEventListener的调用太多,性能不佳