我正在实现从图库或照相机中拾取图像的选项。然后,我检查图像的方向并在必要时旋转图像(例如,拍摄人像照片时使用三星手机)。 它在图库图片上工作正常,但是调用“ cursor.getInt(0)”时,我在相机图片上出现错误。显然,我的uri和游标处理存在问题,但是我不知道这是什么。
这是我的拍照方式:
mCameraFileUri = FileProvider.getUriForFile(getActivity(), com.example.android.fileprovider", cameraPhotoFile);
Intent pickImageFromCamera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
pickImageFromCamera.putExtra(MediaStore.EXTRA_OUTPUT, mCameraFileUri);
我的getOrientation方法(仅适用于画廊图片):
public static int getOrientation(Context context, Uri selectedImage) {
int orientation = -1;
Cursor cursor = context.getContentResolver().query(selectedImage,
new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null);
if (cursor == null || cursor.getCount() != 1)
return orientation;
cursor.moveToFirst();
orientation = cursor.getInt(0);
cursor.close();
return orientation;
}
从画廊中选取content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FIMG_20180805_100104.jpg
使用相机拍摄照片时,我只是出于意图使用了uri,所以selectedImage是:
content://com.example.android.fileprovider/my_images/cameraPicture.jpg
在文件路径中使用uri时,我只会得到空光标:
file:///storage/emulated/0/Android/data/apps.osh.mathforkids/files/Pictures/cameraPicture.jpg
感谢您的帮助!
在CommonsWare注释之后,我将getOrientation方法更改为使用android.support.media.ExifInterface。看起来它可以同时处理来自图库和相机的URI(使用FileProvider)。
这是一个好的解决方案吗?它会检测所有设备上的方向吗?对应用程序内存使用量有何影响?
public static int getOrientation(Context context, Uri selectedImage) {
InputStream in = null;
int rotation = 0;
try {
in = context.getContentResolver().openInputStream(selectedImage);
ExifInterface exifInterface = new ExifInterface(in);
// Now you can extract any Exif tag you want
// Assuming the image is a JPEG or supported raw format
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}
} catch (IOException e) {
// Handle any errors
return rotation;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
return rotation;
}