2011-03-22 46 views
1

我希望在手机旋转时不要改变相机的方向,使相机能够以任何方向拍摄垂直照片。目前,图片在除一个方向以外的所有方向上旋转不正确。测试HTC Incredible运行2.2:如何实现Android相机以任何屏幕方向拍照?

  • 肖像模式有图像顺时针旋转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(); 
} 

由于我想应用程序可与任何API级别等于或高于4兼容最大化的用户群,我如果答案不使用特定于更高API级别的任何内容,则更喜欢。谢谢!

回答

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(); 


} 
+0

不幸的是,setDisplayOrientation仅适用于API级别8以上:[link](http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29) – 2011-03-24 04:24:15

+0

旧版API的setDisplayOrientation替代方法是Camera.Parameters parameters = mCamera .getParameters(); parameters.set(“rotation”,度); mCamera.setParameters(parameters); – 2012-06-01 12:36:20

2

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

要正确旋转图像,您需要在摄像头参数上调用setRotation()(API level 5),然后在调用takePicture API之前设置该参数。你还需要使用orientationEventListener

示例代码here

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); 
相关问题