从Uri获取真实路径始终返回null的问题

3
我正在尝试从图库中选择的图像的Uri中获取真实路径,但是这个函数总是返回null值:
//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个回答

4
这是因为您选择的图片在设备上不存在。
来自相册或其他选择的图像可能来自不提供物理文件的不同源,例如云存储。
请查看此代码,了解如何打开 Uri 作为可用于创建文件副本(或直接读取)的 InputStreamAndroid:从内容URI获取文件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);

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

所以,我仍然不相信有一种强制本地模式的方法,但至少您有更多信息可以对编码做出知情决策。


1
嗨。我编辑了我的答案,并添加了一些可能有用的额外信息。 - Budius
非常感谢,这真的非常有帮助 :) - Chlebta
有趣的hack-a-round,但这也将允许多个文件选择。如果对您的应用程序来说没问题,那太好了。 - Budius
抱歉,我的意思是使用intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); 以仅允许本地文件。 - Chlebta
看起来你自己回答了这个问题 :) 我在这里进行了一些快速测试,似乎对于 ACTION_PICK 是有效的,但是 ACTION_GET_CONTENT 似乎仍然没有传递文件路径。=/ - Budius
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接