5

I want to force the default android camera to take photo in landscape mode only. I have tried following:

         Intent cameraIntent=new Intent("android.media.action.IMAGE_CAPTURE");
         File photo = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "Pic.jpg");
         cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
         cameraIntent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
         startActivity(cameraIntent);

but this works only in 2.1 not for later. I just want to have photo image to be saved in landscape mode. I don't want to use any image processing such as matrix or custom camera.

Note: I am calling this intent from the activity which has the orientation fixed as "portrait"

Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
Hanry
  • 5,481
  • 2
  • 40
  • 53

2 Answers2

3

In androidmanifest.xml

<activity android:name="activity_name" android:screenOrientation="landscape" />

This activity will be your image capturing activity.

Dhruvisha
  • 2,538
  • 1
  • 21
  • 31
0

Using ACTION_IMAGE_CAPTURE intent you have limited control of the app that actually drives the camera. You can expect it to comply with the Intent contract, but nothing more than that.

Standard Intent action that can be sent to have the camera application capture an image and return it.

The caller may pass an extra EXTRA_OUTPUT to control where this image will be written. If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap object in the extra field. This is useful for applications that only need a small image. If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri value of EXTRA_OUTPUT. As of LOLLIPOP, this uri can also be supplied through setClipData(ClipData). If using this approach, you still must supply the uri through the EXTRA_OUTPUT field for compatibility with old applications. If you don't set a ClipData, it will be copied there for you when calling startActivity(Intent).

Note: if you app targets M and above and declares as using the CAMERA permission which is not granted, then atempting to use this action will result in a SecurityException.

You can receive the image from this intent and force rotate it to Landscape, if you are interested. Note that many camera apps today only produce Landscape photos anyway.

Community
  • 1
  • 1
Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
  • After receiving the image from that intent, how should I force rotate it to Landscape? Can you please update your answer by providing code for the same. I want to set the landscaped image as my ImageView's background. – AnV Aug 08 '16 at 09:33
  • To display the image correctly, it's enough to apply its Exif orientation flag and to the image view (e.g. **imageView.setRotation(90)** for `ExifInterface.ORIENTATION_ROTATE_90`). Alternatively, you can rotate the bitmap itself, choose one of the answers [here](http://stackoverflow.com/questions/3647993/android-bitmaps-loaded-from-gallery-are-rotated-in-imageview). You can save this bitmap to disk or send it to the cloud, and it will be displayed correctly by all viewers. The drawbacks of the latter approach are that it may be long and could easily drive you into out-of-memory. – Alex Cohn Aug 08 '16 at 12:27