如何find使用Intent MediaStore.ACTION_IMAGE_CAPTURE拍摄的照片的方向?

当我使用Androids相机应用程序拍照时,它会检测手机的方向并相应地保存照片。 因此,如果我拍摄建筑物的照片,屋顶将位于顶部,无论我将手机保持在横向位置还是纵向。

但是,当我使用时

Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

要获得图片,相机应用程序不会对方向做出反应。 如果我垂直握住手机(人像),将会旋转生成的图片,所述建筑物的屋顶位于屏幕左侧。

如何设置意图以使相机考虑方向?

或者我可以在某种程度上推断出拍摄照片的方向并随后自行旋转?

或者任何其他建议将不胜感激。

〜提前致谢,最诚挚的问候。

Solutions Collecting From Web of "如何find使用Intent MediaStore.ACTION_IMAGE_CAPTURE拍摄的照片的方向?"

find了答案。 图像的exif具有方向的指示符。 以防万一,exif可以在Android中查看,如下所示:

ExifInterface exif = new ExifInterface("filepath"); exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

如果可用,请从Exif中读取,否则从MediaStore中读取

 public static int getImageOrientation(Context context, String imagePath) { int orientation = getOrientationFromExif(imagePath); if(orientation < = 0) { orientation = getOrientationFromMediaStore(context, imagePath); } return orientation; } private static int getOrientationFromExif(String imagePath) { int orientation = -1; try { ExifInterface exif = new ExifInterface(imagePath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_NORMAL: orientation = 0; break; default: break; } } catch (IOException e) { Log.e(LOG_TAG, "Unable to get image exif orientation", e); } return orientation; } private static int getOrientationFromMediaStore(Context context, String imagePath) { Uri imageUri = getImageContentUri(context, imagePath); if(imageUri == null) { return -1; } String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION}; Cursor cursor = context.getContentResolver().query(imageUri, projection, null, null, null); int orientation = -1; if (cursor != null && cursor.moveToFirst()) { orientation = cursor.getInt(0); cursor.close(); } return orientation; } private static Uri getImageContentUri(Context context, String imagePath) { String[] projection = new String[] {MediaStore.Images.Media._ID}; String selection = MediaStore.Images.Media.DATA + "=? "; String[] selectionArgs = new String[] {imagePath}; Cursor cursor = context.getContentResolver().query(IMAGE_PROVIDER_URI, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int imageId = cursor.getInt(0); cursor.close(); return Uri.withAppendedPath(IMAGE_PROVIDER_URI, Integer.toString(imageId)); } if (new File(imagePath).exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, imagePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } return null; } 

要快速修复,您可以检查图像的宽度是否大于图像的高度。 它意味着它的风景,你可以把它改成肖像。

 private Bitmap fromGallery(final Uri selectedImageUri) { try { Bitmap bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); ExifInterface exif = new ExifInterface(selectedImageUri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; default: angle = 0; break; } Matrix mat = new Matrix(); if (angle == 0 && bm.getWidth() > bm.getHeight()) mat.postRotate(90); else mat.postRotate(angle); return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mat, true); } catch (IOException e) { Log.e("", "-- Error in setting image"); } catch (OutOfMemoryError oom) { Log.e("", "-- OOM Error in setting image"); } return null; } 

我使用了文件提供程序,除了制作临时副本并从中读取数据之外没有任何工作。

 public static int getOrientation(Context context, Uri uri) { int rotate = 0; try { ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); FileInputStream input = new FileInputStream(fileDescriptor); File tempFile = File.createTempFile("exif", "tmp"); String tempFilename = tempFile.getPath(); FileOutputStream output = new FileOutputStream(tempFile.getPath()); int read; byte[] bytes = new byte[4096]; while ((read = input.read(bytes)) != -1) { output.write(bytes, 0, read); } input.close(); output.close(); ExifInterface exif = new ExifInterface(tempFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } } catch (Exception e) { Log.i(TAG, e.getLocalizedMessage()); } return rotate; } 

奖金旋转function

 public static Bitmap rotateImage(Context context, Uri uri, int orientation) throws IOException { ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); if (orientation > 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } return bitmap; }