2015-05-29 115 views
0

当设备旋转时,我试图旋转我的相机,iv尝试了几种方法,但似乎没有一种方法适用于所有设备。Android相机旋转通用

//这个工作对我的Nexus 5,但不是我的三星Galaxy Tab上

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
{ 
    if (mHolder.getSurface() == null) 
    { 
     return; 
    } 

    try 
    { 
     mCamera.stopPreview(); 

     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.set("orientation", "landscape"); 
     int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 

     int orientation = getContext().getResources().getConfiguration().orientation; 

     if (rotation == Surface.ROTATION_0) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(0); 
      } else { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 
     else if (rotation == Surface.ROTATION_90) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(270); 
      } 
     } 
     else if (rotation == Surface.ROTATION_180) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(180); 
      } 
     } 
     else if (rotation == Surface.ROTATION_270) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 

     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } 
    catch (Exception e) { 
    } 
} 

//和我想这,这是文档的一部分,它在我的Nexus 5不工作:

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 
      int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 

有人对所有设备都有工作解决方案吗?

+0

你是什么意思,“它不工作”?你输出的图像是否被旋转? – simekadam

+0

相机旋转不正确。对不起,如果我不清楚我的问题。 –

回答

2

虽然我不能完全确定什么是你的问题,从您提供的代码,这里有几件事情之一已经使用Camera API和图像旋转Android上时,得到正确的(旧的 - 在API < 21)

1.您必须考虑图像传感器的orientation

传感器的方向意味着它与设备本地使用模式的角度。 (这就是你正在使用的谷歌代码片段的实际情况)对于手机,这通常被设置为肖像,平板电脑上的风景。 这里是文档的摘录,它可以使头痛一阵子,但这只是事情的工作方式。

例如,假设设备具有自然高屏幕。背面照相机传感器安装在横向上。你正在看屏幕。如果相机传感器的顶部与自然方向的屏幕右边缘对齐,则该值应为90.如果前置摄像头传感器的顶部与屏幕右边对齐,则值应为是270

2. frontfacing相机预览被镜像

如果您使用frontfacing相机,你必须要在账户内隐镜像。

3.这些规则只是针对旋转摄像头预览

这是非常重要的。所有这些只是为了让您在设备屏幕上显示正确旋转的预览帧。一旦拍摄了实际照片,您必须再次旋转它以适应您的需求。对于前置图像,这可能意味着要自己镜像,...您可以在Android上的所有应用程序中看到这种“怪异”的结果。只需在环聊中拍照并马上分享即可。在各种手机上,你必须得到一些奇怪的旋转图像。

4. OEM厂商不符合规格的所有时间

我只能说,这是没有可能的解决方案将是hasslefree,我们得到了一些特定设备的一些问题。 (像往常一样在Android :)

5.使用CWAC相机库

我们发现this library是围绕着官方的API相机卓越的包装。几乎解决了我提到的所有问题。

+0

嗨,感谢所有的洞察力,我可以看到他们为什么制作了一个新的相机API。我不会使用库,但它是一个有用的参考。 –

+0

..回到你的问题..你有预览问题,或由此产生的图像?你可以看到这些是两个不同的东西。 – simekadam

+0

我的问题是预览,即时消息不实际去拍照。我只需要预览 –