从横向切换到反向横向时如何修复倒置相机预览
How to fix inverted camera preview when switching from landscape to reverse landscape
我正在努力将相机应用到我的应用程序中。除了一件事外,一切都很好,当将显示从横向旋转到反向横向时,表面视图不会更新(从反向横向旋转到正常横向时相同)。未调用 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。
有人知道如何解决这个问题吗?
我决定以不同的方式实现它。不再允许 activity 和预览方向改变,它们现在都被锁定了。 activity 使用 AndroidManifest.xml 锁定为纵向,预览锁定为正常横向模式,随着 phone 旋转,我使用 OrientationEventListener 确定旋转角度并调整输出图像和快门按钮的旋转,所以感觉方向发生了变化,但实际上 activity 和预览保持相同的方向。
这完美地工作,让我不必执行不必要的代码。此方法还消除了重新加载 activity 时方向更改的延迟,因为 activity 不再经历方向更改并且它不会调用 onCreate()。
我正在努力将相机应用到我的应用程序中。除了一件事外,一切都很好,当将显示从横向旋转到反向横向时,表面视图不会更新(从反向横向旋转到正常横向时相同)。未调用 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。
有人知道如何解决这个问题吗?
我决定以不同的方式实现它。不再允许 activity 和预览方向改变,它们现在都被锁定了。 activity 使用 AndroidManifest.xml 锁定为纵向,预览锁定为正常横向模式,随着 phone 旋转,我使用 OrientationEventListener 确定旋转角度并调整输出图像和快门按钮的旋转,所以感觉方向发生了变化,但实际上 activity 和预览保持相同的方向。
这完美地工作,让我不必执行不必要的代码。此方法还消除了重新加载 activity 时方向更改的延迟,因为 activity 不再经历方向更改并且它不会调用 onCreate()。