【问题标题】:How to fix inverted camera preview when switching from landscape to reverse landscape从横向切换到反向横向时如何修复倒置的相机预览
【发布时间】:2015-05-06 22:59:49
【问题描述】:

我正在努力将相机应用到我的应用中。一切都很好,除了一件事,当将显示器从横向旋转到反向横向时,表面视图不会更新(从反向横向旋转到正常横向时相同)。不调用surfaceChanged,因此,预览显示颠倒。如果我将显示器从纵向旋转到横向或反向横向,则效果很好。

我曾尝试在我的 CameraActivity(它扩展 ActionBarActivity)中使用 onConfigurationChange 来捕捉这一点,但在方向从正常横向变为反向横向(或相反)的情况下不会调用它。我了解到这是因为在这种情况下实际上没有配置发生变化。方向仍然是横向,屏幕大小没有改变,因此,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。

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

【问题讨论】:

    标签: java android camera orientation-changes


    【解决方案1】:

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

    这完美无缺,让我不必实现不必要的代码。此方法还消除了重新加载 Activity 时方向更改的延迟,因为 Activity 不再经历方向更改并且它不会调用 onCreate()。

    【讨论】:

    • 但是OrientationEventListener被调用太多,性能不好
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2011-04-19
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多