如何在从横向切换到反向横向时修复倒置摄像头预览

时间:2015-05-06 22:59:49

标签: java android camera orientation-changes

我正致力于将相机应用到我的应用中。一切都很好,除了一件事,当将显示从风景旋转到反转景观时,表面视图不会更新(从反转景观旋转到正常景观时也是如此)。不调用surfaceChanged,因此预览显示颠倒。如果我将显示从纵向旋转到横向或反转景观,它将完美运行。

我尝试使用我的CameraActivity中的onConfigurationChange(它扩展了ActionBarActivity)来捕获这个,但是在方向从正常横向变为反向横向(或反过来)的情况下不会调用它。我了解到这是因为在这种情况下没有配置实际发生变化。方向仍然是横向的,屏幕尺寸不会改变,因此,onConfigurationChange不会被调用...

接下来,我决定使用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。我在上面的代码中看到了这个null,但是当调用Camera.open()时,我的应用程序崩溃了。尝试使用Camera.open()在onOrientationChanged中设置mCamera时发生NullPointerException。

我还试过从OrientationEventListener中调用surfaceChanged,并且出现完全相同的问题。当我尝试在surfaceChanged中设置null mCamera变量时,只发生NullPointerException。

有谁知道如何解决此问题?

1 个答案:

答案 0 :(得分:0)

我决定以不同的方式实现这一点。它们现在都被锁定,而不是允许活动和预览方向改变。使用AndroidManifest.xml将活动锁定为纵向,并且在正常横向模式下锁定预览,并且在手机旋转时,我使用OrientationEventListener来确定旋转角度并调整输出图像和快门按钮的旋转,以便感觉有一个方向改变,但实际上活动和预览保持相同的方向。

这完美无缺,阻止我实现不必要的代码。此方法还会在重新加载活动时消除方向更改的延迟,因为活动不再通过方向更改而且不会调用onCreate()。