2014-11-24 57 views
2

我试图从URI(所选择从图片库图片)得到真正的路径,但这个函数总是返回空值:GetRealPathFromUri总是空的结果

//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(); 
     } 
    } 
} 

回答

2

那是因为你要选择的图像不在设备上物理可用。

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

请查看此代码,了解如何打开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); 

和它打开奇巧风格统一选择器,如果从那里选择一个图像,它将始终返回null。如果打开左侧抽屉菜单,选择图库(或文件浏览器),然后从那里选取图像,然后如果它是本地文件图像,则将具有正确的路径。

在另一方面

,如果你要求它这样的(这是旧法):

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

就会直接打开库,并再次,如果它是一个本地文件的图像,你会有正确的路径。

所以是的,我仍然不相信有一种方法可以强制本地化,但至少您有更多的信息来对您的编码做出明智的决定。

+0

那么有没有什么方法可以只显示设备上可用的图像? – Chlebta 2014-11-25 09:47:31

+0

我不相信我见过这个选项。我相信如果你想强加这个限制,唯一的办法就是创建你自己的“照片选择”。但请,如果您找到了一种方法,请与我们分享。 – Budius 2014-11-25 09:51:59

+0

现在我是gona使用你的解决方案,因为我没有太多时间,但将来我会尽力做到这一点,并分享它。我也可以收到你的邮件吗? – Chlebta 2014-11-25 10:01:12