Bitmap dimensions using camera (custom view)
===

I'm developing for API 7 (2.1). I implemented a camera view like this:

    public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
	SurfaceHolder mHolder;

	int width;
	int height;

	Camera mCamera;

	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initHolder();
	}

	public CameraView(Context context) {
		super(context);
		initHolder();
	}

	private void initHolder() {
		// Install a SurfaceHolder.Callback so we get notified when the
		// underlying surface is created and destroyed.
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	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(90) };
    //				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);
		setDisplayOrientation(mCamera, 90);
		
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (IOException exception) {
			mCamera.release();
			mCamera = null;
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		// Surface will be destroyed when we return, so stop the preview.
		// Because the CameraDevice object is not a shared resource, it's very
		// important to release it when the activity is paused.
		mCamera.stopPreview();
		mCamera.release();
		mCamera = null;
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		width = w;
		height = h;
		// Now that the size is known, set up the camera parameters and begin the preview.
		Camera.Parameters parameters = mCamera.getParameters();
		//parameters.setPreviewSize(w, h);
		mCamera.setParameters(parameters);
		
		mCamera.startPreview();
	}

	public void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg) {
		mCamera.takePicture(shutter, raw, jpeg);
	}
	
	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) {}
	}
    }

Only the approach using reflection (taken from Williew's answer in http://stackoverflow.com/questions/5309029/android-camera-rotate) works on my device to show the preview with the correct rotation, otherwise, the preview is always rotated -90°

So far so good, but now I have another problem. When I get the bitmap with the activitie's callback:

	public void onPictureTaken(byte[] data, Camera camera) {
		Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
		
		Log.d("test", "---width: "  + b.getWidth() + " height: " + b.getHeight());
	}

It's always in landscape mode! (in this case 2560 x 1920). So if the user took a picture holding the device in portrait mode, I get a bitmap 2560 x 1920, which anyways, for some reason looks exactly like the portrait pic I took, when I put in in an image view. Problem comes when the user takes the pic holding the device in landscape mode, I would like to rotate it, in order to show the result in portrait mode (scaled down) - or do some other special actions for landscape pics.

But I can't differentiate them from the portrait pics because the bitmap's dimensions are the same :/

How do I recognize portrait / landscape pictures?

Any idea...? I'm new to the camera and kind of lost...
Thanks in advance.