3

我正在使用这段代码:

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

其中ManifestActivity Orientation设置为Landscape

所以,这就像只允许用户在横向模式下拍照,如果是通过手持设备在纵向模式下拍照,保存的图像是这样的:

在此处输入图像描述

旋转 90 度的图像。

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

Android - 相机预览是横向的

解决方案是:

surfaceChanged()检查_

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

并相应地更改相机的 displayOrientation

camera.setDisplayOrientation(90);

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

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

4

2 回答 2

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());
    }
}
于 2013-04-19T06:39:48.307 回答
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);
 }

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

于 2013-04-19T23:37:13.727 回答