图像保存方向错误

时间:2013-04-19 06:06:54

标签: android camera commonsware

我正在使用此代码:

https://github.com/commonsguy/cw-advandroid/blob/master/Camera/Picture/src/com/commonsware/android/picture/PictureDemo.java

Manifest中,Activity Orientation设置为横向

因此,它允许用户仅在横向模式下拍摄照片,如果通过将设备保持在纵向模式拍照,则保存的图像如下:

enter image description here

90度旋转图像。

在寻找解决方案后,我发现了这个:

Android - Camera preview is sideways

解决方案是:

surfaceChanged()中检查

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
display.getRotation();

并相应地更改相机的displayOrientation

camera.setDisplayOrientation(90);

但无论我旋转设备多少次,surfaceChanged()都不会被调用。

我甚至尝试删除 Manifest.xml 中的orientation="Landscape",但是预览本身会侧向显示(可能是因为默认android.view.SurfaceView应该在横向模式?)。

2 个答案:

答案 0 :(得分:4)

试试这个。

public void surfaceCreated(SurfaceHolder holder) {
    try {
        camera = Camera.open();
        camParam = camera.getParameters();
        Camera.Parameters params = camera.getParameters();
        String currentversion = android.os.Build.VERSION.SDK;
        Log.d("System out", "currentVersion " + currentversion);
        int currentInt = android.os.Build.VERSION.SDK_INT;
        Log.d("System out", "currentVersion " + currentInt);

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            if (currentInt != 7) {
                camera.setDisplayOrientation(90);
            } else {
                Log.d("System out", "Portrait " + currentInt);

                params.setRotation(90);

                /*
                 * params.set("orientation", "portrait");
                 * params.set("rotation",90);
                 */
                camera.setParameters(params);
            }
        }
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // camera.setDisplayOrientation(0);
            if (currentInt != 7) {
                camera.setDisplayOrientation(0);
            } else {
                Log.d("System out", "Landscape " + currentInt);
                params.set("orientation", "landscape");
                params.set("rotation", 90);
                camera.setParameters(params);
            }
        }
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (IOException e) {
        Log.d("CAMERA", e.getMessage());
    }
}

答案 1 :(得分:0)

由于您已迫使应用程序成为横向应用程序,因此在旋转设备时,应用程序的配置不会更改,因此您的UI不会重新绘制。因此,你永远不会看到surfaceCreated / Changed回调。

在任何情况下,您的问题都不是预览,而是拍摄的照片。

相机API不会自动知道哪个方向已关闭;它需要您使用Camera.Parameters setRotation方法告诉它您希望如何旋转图像。这里有几个坐标系统(相机传感器相对于您的设备的方向; UI相对于设备的方向;以及设备相对于世界的方向)必须正确完成。

所以我强烈建议您使用setRotation文档中提供的代码,并继承自OrientationEventListener,按如下方式实现监听器:

 public void onOrientationChanged(int orientation) {
   if (orientation == ORIENTATION_UNKNOWN) return;
   android.hardware.Camera.CameraInfo info =
        new android.hardware.Camera.CameraInfo();
   android.hardware.Camera.getCameraInfo(cameraId, info);
   orientation = (orientation + 45) / 90 * 90;
   int rotation = 0;
   if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
       rotation = (info.orientation - orientation + 360) % 360;
   } else {  // back-facing camera
     rotation = (info.orientation + orientation) % 360;
   }
   mParameters.setRotation(rotation);
 }

这将正确更新相机的静态图片方向,以便“向上”始终处于启动状态,无论您的应用是横向还是纵向,或者您的设备是平板电脑还是手机。