Android Camera Rotation Generic

时间:2015-05-29 06:49:13

标签: android camera rotation orientation

我试图在设备旋转时旋转相机,iv尝试了几种方法,但它们似乎都不适用于所有设备。

//这适用于我的nexus 5,但不适用于我的三星Galaxy标签

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

是否有人为所有设备提供了有效的解决方案?

1 个答案:

答案 0 :(得分:2)

虽然我不完全确定您提供的代码中的问题是什么,但在Android上使用Camera API和图像轮换时,必须要做的事情很少(旧的 - 在API上) < 21)

<强> 1。您必须考虑图像传感器的orientation

传感器的方向意味着它与设备本机使用模式的角度。 (这就是你正在使用的谷歌片段实际上是什么)对于手机,这通常被设置为肖像,平板电脑到横向。 以下是文档的摘录,它可以让人头疼一段时间,但事情就是如此。

  

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

<强> 2。正面镜像正面镜头预览

如果使用前置摄像头,则必须考虑隐式镜像。

第3。这些规则仅用于旋转相机预览

这很重要。所有这些只是为了让您在设备屏幕上显示正确旋转的预览帧。拍摄实际照片后,您必须再次旋转它以满足您的需要。对于前置图像,这可能意味着自己镜像,......你可以看到这个&#34;怪异的结果&#34;在Android上的所有应用中。只需在环聊中拍照并立即分享即可。在各种手机上你得到一些奇怪的旋转图像作为结果。

<强> 4。 OEM始终不遵守规范

我只能说,可能没有任何解决方案是无忧无虑的,我们在某些特定设备上遇到了一些问题。 (像往常一样在Android上:)

<强> 5。使用CWAC相机库

我们发现this library是官方Camera API的优秀包装器。几乎解决了我提到的所有问题。