如何实现Android相机以任何屏幕方向拍摄照片?

时间:2011-03-22 08:01:59

标签: android android-camera

我希望在手机旋转时相机的方向不要改变,让相机以任何方向拍摄直立的照片。目前,除了一个方向外,图片在所有方向上都旋转不正确。在HTC Incredible上运行测试2.2:

  • 纵向模式使图像顺时针旋转90度。
  • 从纵向逆时针旋转的设备会使图像旋转180度。
  • 从纵向顺时针旋转的设备会生成方向正确的图像。

以下是相机实施的相关代码:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);

    // Set up camera's SurfaceView and SurfaceHolder
    surfaceView = (SurfaceView) findViewById(R.id.camera_surface);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Camera.Parameters p = camera.getParameters();
    p.setPreviewSize(width,height);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        camera.release();
    }
    camera.startPreview();
}

由于我希望应用程序与任何等于或高于4的API级别兼容以最大化用户群,因此我更愿意,如果答案没有使用任何特定于更高API级别的内容。谢谢!

3 个答案:

答案 0 :(得分:2)

如果您还不希望预览也旋转,请在清单文件中将方向设置为横向或纵向模式。

要获得正确旋转的图像,您需要在camera参数上调用setRotation()(API级别5),然后在调用takePicture API之前设置该参数。您还需要使用orientationEventListener

示例代码here

答案 1 :(得分:0)

试试这个,但我认为这是错误的。我也有这个问题,但在我的情况下,我找不到任何东西。

此代码可以是正确的,当您使用相机预览时可能必须帮助您。

如果没有 - 此代码对您没有帮助。我没有使用相机,所以它没有帮助我。

public void surfaceCreated(SurfaceHolder holder)  
{
    try
    {
        camera.setPreviewDisplay(holder);
        camera.setPreviewCallback(this);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    Size previewSize = camera.getParameters().getPreviewSize();
    float aspect = (float) previewSize.width / previewSize.height;

    int previewSurfaceWidth = preview.getWidth();
    int previewSurfaceHeight = preview.getHeight();

    LayoutParams lp = preview.getLayoutParams();


    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
    {
        // ïîðòðåòíûé âèä
        camera.setDisplayOrientation(90);
        lp.height = previewSurfaceHeight;
        lp.width = (int) (previewSurfaceHeight / aspect);
    }
    else
    {
        camera.setDisplayOrientation(0);
        lp.width = previewSurfaceWidth;
        lp.height = (int) (previewSurfaceWidth / aspect);
    }

    preview.setLayoutParams(lp);
    camera.startPreview();


}

答案 2 :(得分:0)

这应该照顾任何屏幕方向,包括前后摄像头的不同处理方式:

// Set camera rotation (consider display orientation)
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int displayOrientation = display.getRotation();

int rotation = cameraInfo.orientation;
if (Surface.ROTATION_0 != displayOrientation)
{
    if (CameraInfo.CAMERA_FACING_BACK == cameraInfo.facing)
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation -= 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation -= 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation -= 270;
        }

        if (rotation < 0)
        {
            rotation += 360;
        }
    }
    else
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation += 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation += 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation += 270;
        }

        rotation %= 360;
    }
}

Log.d(TAG, "Camera orientation (" + cameraInfo.orientation + ", " + displayOrientation + ", " + rotation + ")");

cameraParams.setRotation(rotation);