How to change Android camera to portrait in surface view?

I am encoding an Android tablet and want my application to use portrait camera preview surfaceView. By default, this is a landscape, and I tried the following code to rotate into portrait view:

public void surfaceCreated(SurfaceHolder holder){
  // The Surface has been created, acquire the camera and tell it where to draw.
  mCamera = Camera.open();
  Parameters params = mCamera.getParameters();
  // If we aren't landscape (the default), tell the camera we want portrait mode
  if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
    params.set("orientation", "portrait"); // "landscape"
    // And Rotate the final picture if possible
    // This works on 2.0 and higher only
    //params.setRotation(90);
    // Use reflection to see if it exists and to call it so you can support older versions
      try {
        Method rotateSet = Camera.Parameters.class.getMethod("setRotation", new Class[] { Integer.TYPE } );
        Object arguments[] = new Object[] { new Integer(270) };
        rotateSet.invoke(params, arguments);
      } catch (NoSuchMethodException nsme) {
        // Older Device
        Log.v("CameraView","No Set Rotation");
      } catch (IllegalArgumentException e) {
        Log.v("CameraView","Exception IllegalArgument");
      } catch (IllegalAccessException e) {
        Log.v("CameraView","Illegal Access Exception");
      } catch (InvocationTargetException e) {
        Log.v("CameraView","Invocation Target Exception");
      }
  }
  mCamera.setParameters(params);
  try{
    mCamera.setPreviewDisplay(holder);
  } catch (IOException exception) {
    mCamera.release();
    mCamera = null;
  }
}

But that will not work. Can anyone fix it?

+5
source share
1 answer

You probably want to use the function setDisplayOrientationas follows:

public void surfaceCreated(SurfaceHolder holder) {
    if (Build.VERSION.SDK_INT >= 8) mCamera.setDisplayOrientation(90);
}

The use of the camera params.set("orientation"...material is not consistent between devices and is indeed the language of pre-SDK 8.

+7
source

All Articles