title: Bitmap dimensions using camera (custom view)
body: <p>I'm developing for API 7 (2.1). I implemented a camera view like this:</p>
  
  <pre><code>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) {}
  }
  }
  </code></pre>
  
  <p>Only the approach using reflection (taken from Williew's answer in <a href="https://stackoverflow.com/questions/5309029/android-camera-rotate">Android camera rotate</a>) works on my device to show the preview with the correct rotation, otherwise, the preview is always rotated -90°</p>
  
  <p>So far so good, but now I have another problem. When I get the bitmap with the activitie's callback:</p>
  
  <pre><code>public void onPictureTaken(byte[] data, Camera camera) {
      Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
  
      Log.d("test", "---width: "  + b.getWidth() + " height: " + b.getHeight());
  }
  </code></pre>
  
  <p>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.</p>
  
  <p>But I can't differentiate them from the portrait pics because the bitmap's dimensions are the same :/</p>
  
  <p>How do I recognize portrait / landscape pictures?</p>
  
  <p>Any idea...? I'm new to the camera and kind of lost...
  Thanks in advance.</p>
  
  <p><strong>Edit</strong>
  Ok, I think there's no problem, with the dimensions always being the same, because the picture has actually always the same dimensions, no matter how I was holding the device. Only thing I don't understand is why I always get width > height when the preview and the pics are clearly in portrait mode.</p>