Java 如何修复从横向切换到反向横向时的反向摄影机预览
我正在将摄像头应用到我的应用程序中。除一件事外,所有功能都正常工作,当将显示器从横向旋转到反向横向时,surfaceview不会更新(从反向横向旋转到正常横向时相同)。不调用surfaceChanged,因此,预览会颠倒显示。如果我将显示器从纵向旋转到横向或反向横向,效果会非常好 我曾尝试在CameraActivity(扩展ActionBarActivity)中使用OnConfiguration Change捕捉到这一点,但在方向从正常方向更改为反向方向(或相反方向)的情况下,不会调用它。我了解到这是因为在这种情况下没有任何配置会发生实际变化。方向仍然是横向的,屏幕大小不变,因此,OnConfiguration change不被称为 接下来,我决定尝试使用一个OrientationEventListener来实现这一点,但我似乎无法从这个侦听器中访问相机:Java 如何修复从横向切换到反向横向时的反向摄影机预览,java,android,camera,orientation-changes,Java,Android,Camera,Orientation Changes,我正在将摄像头应用到我的应用程序中。除一件事外,所有功能都正常工作,当将显示器从横向旋转到反向横向时,surfaceview不会更新(从反向横向旋转到正常横向时相同)。不调用surfaceChanged,因此,预览会颠倒显示。如果我将显示器从纵向旋转到横向或反向横向,效果会非常好 我曾尝试在CameraActivity(扩展ActionBarActivity)中使用OnConfiguration Change捕捉到这一点,但在方向从正常方向更改为反向方向(或相反方向)的情况下,不会调用它。我了解
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的调用太多,性能不佳