相机图片uri上的光标错误

时间:2018-08-07 22:49:17

标签: android uri android-camera-intent android-cursor

我正在实现从图库或照相机中拾取图像的选项。然后,我检查图像的方向并在必要时旋转图像(例如,拍摄人像照片时使用三星手机)。 它在图库图片上工作正常,但是调用“ 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

时selectedImage uri的示例

使用相机拍摄照片时,我只是出于意图使用了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;
}

0 个答案:

没有答案