我正致力于将相机应用到我的应用中。一切都很好,除了一件事,当将显示从风景旋转到反转景观时,表面视图不会更新(从反转景观旋转到正常景观时也是如此)。不调用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。
有谁知道如何解决此问题?
答案 0 :(得分:0)
我决定以不同的方式实现这一点。它们现在都被锁定,而不是允许活动和预览方向改变。使用AndroidManifest.xml将活动锁定为纵向,并且在正常横向模式下锁定预览,并且在手机旋转时,我使用OrientationEventListener来确定旋转角度并调整输出图像和快门按钮的旋转,以便感觉有一个方向改变,但实际上活动和预览保持相同的方向。
这完美无缺,阻止我实现不必要的代码。此方法还会在重新加载活动时消除方向更改的延迟,因为活动不再通过方向更改而且不会调用onCreate()。