ibm123
ibm123

Reputation: 1254

Android, camera in my app is rotated

i'm opening the Camera in my app and the cam display is rotated by 90deg allways even when i rotating the device in my hands.

the code:

import java.io.IOException;
import java.util.List;    
import android.content.Context;
import android.hardware.Camera;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
        private SurfaceHolder holder;
        private Camera camera;
        private Context context;
        public CameraSurfaceView(Context context) 
        {
                super(context);

                //Initiate the Surface Holder properly
                this.holder = this.getHolder();
                this.holder.addCallback(this);
                this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
                this.context = context;
          }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {               

        // Now that the size is known, set up the camera parameters and  begin
            // the preview.
            Camera.Parameters parameters = camera.getParameters();
            List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
            Camera.Size size = previewSizes.get(0);
            parameters.setPreviewSize(size.width, size.height);           

            Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

            if(display.getOrientation() == Surface.ROTATION_0)
            {
                //parameters.setPreviewSize(height, width);                           
                parameters.setRotation(90);
            }

            if(display.getOrientation() == Surface.ROTATION_90)
            {
                //parameters.setPreviewSize(width, height);                           
            }

            if(display.getOrientation() == Surface.ROTATION_180)
            {
                //parameters.setPreviewSize(height, width);               
            }

            if(display.getOrientation() == Surface.ROTATION_270)
            {
                //parameters.setPreviewSize(width, height);
                parameters.setRotation(180);
            }                
            camera.setParameters(parameters);                
            camera.startPreview();              
        }    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
             try
             {
                     //Open the Camera in preview mode
                     this.camera = Camera.open();
                     this.camera.setPreviewDisplay(this.holder);
             }
             catch(IOException ioe)
             {
                     ioe.printStackTrace(System.out);
             }              
        }    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // Surface will be destroyed when replaced with a new screen
            //Always make sure to release the Camera instance
            camera.stopPreview();
            camera.release();
            camera = null;              
        }
  }

Any ideas ? Thanks

p.s how do i know what is the correct choose for my device in the line

List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();

Upvotes: 1

Views: 1264

Answers (2)

Uday
Uday

Reputation: 6023

I used this code, when i wanted to display the camera preview correctly

 Camera.Parameters parameters = camera.getParameters();
            parameters.set("jpeg-quality", 100);
            parameters.set("orientation", "landscape");
            parameters.set("rotation", 90);
            parameters.setPictureFormat(PixelFormat.JPEG);

            parameters.setPreviewSize(w, h);
            camera.setParameters(parameters);

Upvotes: 1

a.ch.
a.ch.

Reputation: 8380

Look at the example code given in Camera.setDisplayOrientation(int degrees) method reference. Note that you should perform these actions before calling setPreviewDisplay (SurfaceHolder)

Upvotes: 0

Related Questions