Fix Android Camera app aspect ratio and rotation

12,316

Change your surfaceChanged method with this :

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {       
    Parameters parameters = mCamera.getParameters();
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
    Camera.Size previewSize = previewSizes.get(4); //480h x 720w

    parameters.setPreviewSize(previewSize.width, previewSize.height);
    parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

    mCamera.setParameters(parameters);

    Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    if(display.getRotation() == Surface.ROTATION_0) {                        
        mCamera.setDisplayOrientation(90);
    } else if(display.getRotation() == Surface.ROTATION_270) {
        mCamera.setDisplayOrientation(180);
    }

    mCamera.startPreview();
}

I hope I have helped you!

Share:
12,316
A.Jouni
Author by

A.Jouni

Android Developer https://play.google.com/store/apps/developer?id=Jouni

Updated on July 20, 2022

Comments

  • A.Jouni
    A.Jouni almost 2 years

    How it looks: http://i41.tinypic.com/30278m1.png

    It looks like in the pic ,I want it to have a correct aspect ratio with correct rotaion

    Take a look the code please , how can I fix it ?

    This is my code:

        public class MainActivity extends Activity implements SurfaceHolder.Callback {
    
    Camera mCamera;
    SurfaceView mPreview; 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPreview = (SurfaceView)findViewById(R.id.preview);
        mPreview.getHolder().addCallback(this);
        mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mCamera = Camera.open();
    }   
    @Override
    public void onPause() {
        super.onPause();
        mCamera.stopPreview();
    }    
    @Override
    public void onDestroy() {
        super.onDestroy();
        mCamera.release();
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters params = mCamera.getParameters();
        List<Camera.Size> sizes = params.getSupportedPreviewSizes();
        Camera.Size selected = sizes.get(0);
        params.setPreviewSize(selected.width,selected.height);
        mCamera.setParameters(params);
        mCamera.startPreview();
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(mPreview.getHolder());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i("PREVIEW","surfaceDestroyed");
    }
    }
    
  • A.Jouni
    A.Jouni almost 11 years
    isPreviewRunning & getContext are marked as errors ! isPreviewRunning cannot be resolved to a variable & The method getContext() is undefined
  • lopez.mikhael
    lopez.mikhael almost 11 years
    Ok, I just changed my answer.
  • A.Jouni
    A.Jouni almost 11 years
    excellent work mikhael !! it worked , I took a look at your site you have done good projects
  • swbandit
    swbandit almost 10 years
    Could you explain a the solution for the aspect ratio fix?