Matisse 拍摄相片返回的Uri路径无法转换为真实路径的完美解决方案

最近因为项目需要加入了知乎的图片选择器,并使用了里面拍照功能,在压缩文件时需要将 Uri 路径转换成真实路径,发现从图库选择的没问题,但是拍照返回的Uri再调用PhotoMetadataUtils.getPath()获取路径报错。cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)总返回-1。,找了很久,终于找到了解决方案,特此贴出来。

问题:拍摄返回的路径是content://com.example.demo.fileprovider/my_images/PicturesJPEG_20181012_121424_.jpg
也这个路径是不能转换成真实路径的,针对这个问题,特意的去翻了下源码,发现拍照生成的图片文件是固定的,所以我们可以根据uri 自己拼凑出路径 直接上代码。当你通过其他方法拿不到路径时,就可以通过下面的方案解决问题

解决方案(亲测可用):

  /**
    *  根据Uri获取文件真实地址
    */
    public static String getRealFilePath(Context context, Uri uri) {
        if (null == uri) return null;
        final String scheme = uri.getScheme();
        String realPath = null;
        if (scheme == null)
            realPath = uri.getPath();
        else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            realPath = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = context.getContentResolver().query(uri,
                    new String[]{MediaStore.Images.ImageColumns.DATA},
                    null, null, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                    if (index > -1) {
                        realPath = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        if (TextUtils.isEmpty(realPath)) {
            if (uri != null) {
                String uriString = uri.toString();
                int index = uriString.lastIndexOf("/");
                String imageName = uriString.substring(index);
                File storageDir;

                storageDir = Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES);
                File file = new File(storageDir, imageName);
                if (file.exists()) {
                    realPath = file.getAbsolutePath();
                } else {
                    storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
                    File file1 = new File(storageDir, imageName);
                    realPath = file1.getAbsolutePath();
                }
            }
        }
        return realPath;
    }

点个赞吧!

你可能感兴趣的:(Android,疑难杂症,Matisse,Uri转file,android)