GetRealPathFromUri总是得到null结果

时间:2014-11-24 20:13:47

标签: android uri

我试图从Uri获取真实路径(来自图库的选定图像)但此函数始终返回空值:

//Convert the image URI to the direct file system path of the image file
public String getRealPathFromURI(Uri contentUri) {

    Cursor cursor = null;
    try {

        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = getActivity().getContentResolver().query(contentUri,  proj, null, null, null);
        cursor.moveToFirst();
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        return cursor.getString(column_index);
    } finally {

        if (cursor != null) {

            cursor.close();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这是因为您选择的图片在设备上无法实际显示。

来自图库或其他选择的图片可能来自不提供物理文件的不同来源,例如云存储。

请在此处查看此代码,了解如何打开Uri作为InputStream,可用于创建文件副本(或直接阅读)。

Android: Getting a file URI from a content URI?

修改

我正在对它进行一些额外的研究,显然它也因你如何请求这个Uri而有所不同。

如果您这样请求(根据Android指南,这是当前首选的方法):

 i = new Intent(Intent.ACTION_GET_CONTENT);
 i.addCategory(Intent.CATEGORY_OPENABLE);
 i.setType("image/*");
 startActivityForResult(i, REQUEST_STORAGE);

并打开KitKat样式统一选择器,如果从那里选择图像,它将始终返回null。如果您打开左侧抽屉菜单,请选择图库(或文件浏览器),然后从那里选择一个图像,然后,如果它是本地文件图像,您将拥有正确的路径。

另一方面,如果您这样请求它(这是旧方法):

 i = new Intent(Intent.ACTION_PICK);
 i.setType("image/*");
 startActivityForResult(i, REQUEST_STORAGE);

它会直接打开图库,如果它是本地文件图像,您将拥有正确的路径。

所以是的,我仍然不相信那里只有强制本地的方式,但至少你有更多的信息可以对你的编码作出明智的决定。