How to set Android camera orientation properly? How to set Android camera orientation properly? android android

How to set Android camera orientation properly?


From other member and my problem:

Camera Rotation issue depend on different Devices and certain Version.

Version 1.6: to fix the Rotation Issue, and it is good for most of devices

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)        {               p.set("orientation", "portrait");            p.set("rotation",90);        }        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)        {                                           p.set("orientation", "landscape");                      p.set("rotation", 90);        }

Version 2.1: depend on kind of devices, for example, Cannt fix the issue with XPeria X10, but it is good for X8, and Mini

Camera.Parameters parameters = camera.getParameters();parameters.set("orientation", "portrait");camera.setParameters(parameters);

Version 2.2: not for all devices

camera.setDisplayOrientation(90);

http://code.google.com/p/android/issues/detail?id=1193#c42


From the Javadocs for setDisplayOrientation(int) (Requires API level 9):

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


This solution will work for all versions of Android. You can use reflection in Java to make it work for all Android devices:

Basically you should create a reflection wrapper to call the Android 2.2 setDisplayOrientation, instead of calling the specific method.

The method:

    protected void setDisplayOrientation(Camera camera, int angle){    Method downPolymorphic;    try    {        downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });        if (downPolymorphic != null)            downPolymorphic.invoke(camera, new Object[] { angle });    }    catch (Exception e1)    {    }}

And instead of using camera.setDisplayOrientation(x) use setDisplayOrientation(camera, x) :

    if (Integer.parseInt(Build.VERSION.SDK) >= 8)        setDisplayOrientation(mCamera, 90);    else    {        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)        {            p.set("orientation", "portrait");            p.set("rotation", 90);        }        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)        {            p.set("orientation", "landscape");            p.set("rotation", 90);        }    }