17

I'm using the camera to show preview only (not to take pictures or record videos).

The app is always in portrait mode (landscape mode is disabled). The camera preview is always rotated 90 degrees ccw and I can't change it (neither with setDisplayOrientation nor with p.set("orientation", "portrait" ) and p.set("rotation", 90) ).

Is the preview ALWAYS rotated like this or is it device dependent? If it was always like this in portrait mode, I could just rotate the image afterwards.

Or is there a way to set up the camera correctly? I've read a lot of threads about this but no answer worked for me (Galaxy s2, Android v2.3)

Asif Patel
  • 1,744
  • 1
  • 20
  • 27
DominicM
  • 2,186
  • 5
  • 24
  • 42

2 Answers2

39

To force portrait orientation:

set android:screenOrientation="portrait" in your AndroidManifest.xml and call camera.setDisplayOrientation(90); before calling camera.startPreview();

I have not tested on the GS2 but it works on every phone I have tested on.

Note: setDisplayOrientation was added in API Level 8

smith324
  • 13,020
  • 9
  • 37
  • 58
  • This works on the emulator but not on my GS2. But if I understand it correctly, the camera ALWAYS has to be rotated 90° CW in portrait mode is that correct? Because then I will rotate it myself. This would be a better way anyway because it would work on API Level lower than 8. – DominicM May 19 '12 at 11:05
  • 2
    **This doesn't work on Samsung Ace**, here I posted problem http://stackoverflow.com/questions/19176038/camera-setdisplayorientation-function-is-not-working-for-samsung-galaxy-ace-wi – swiftBoy Nov 13 '13 at 12:01
  • It doesn't have to be rotated 90degrees ALWAYS. See answer here: http://stackoverflow.com/questions/4697631/android-screen-orientation – Sonhja Dec 20 '13 at 10:17
7

I have coded the app for only Portrait Mode.

camera.setDisplayOrientation(90);

Will make the Camera to rotate to 90 degree and This may result in not suitable Orientation for some devices in android In order to get the Correct Preview for all android devices use the following code which is refereed in developers site.

Below you have to send your activity, cameraId = back is 0 and for Front camera is 1

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;
    //int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        // do something for phones running an SDK before lollipop
        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 is how to set the setDisplayOrientation for camera which will perfectly for all android devices.

vignesh waran
  • 159
  • 2
  • 4
  • 1
    that work for the display, but when you want to take the picture you'll always have a 270° rotated picture with the front camera and a 90 rotated picture with the back camera (if you have the same phone asme) this code just corrige the display. Add a camera.getParameters().setRotation(result) and it's ok! – lebarillier Oct 17 '18 at 08:41
  • I am also finding the same issue as @lebarillier has described. On my Huawei Mate 10, the orientation on the front camera, is rotated 90. I coded, and published to the store, but found on other devices that the adjustment is not the same. Therefore need to look at using sensors, and the orientation angle to calculate correct adjustments. – Jeffrey Holmes Nov 22 '19 at 02:20