2017-02-22 134 views
-1

我用这个方法来从URI得到的文件路径:错误从Download文件夹路径获取图像的Android

public String getPath(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    String document_id = cursor.getString(0); 
    document_id = document_id.substring(document_id.lastIndexOf(":") + 1); 
    cursor.close(); 

    cursor = getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null); 
    cursor.moveToFirst(); 
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
    cursor.close(); 

    return path; 
} 

如果我尝试从一个图像文件获取文件的路径,从画廊的作品完美。但是,当我尝试从下载文件夹中的图像文件获取路径文件时,不起作用。有什么建议么。非常感谢你提前。

回答

2

我用这个方法来得到URI

是不会工作的文件路径。

如果我尝试从画廊的图像文件中获取的文件路径的作品完美

并非在所有设备上,而不是对所有图像。

任何建议

你似乎认为一个Uri必须映射到一个文件,你可以找到的路径的文件,并且该路径是什么,你可以使用。

这些都不是真的。

如果Uri的方案恰好是file然后getPath()将是一个文件系统路径,指着那(大概),你可以访问文件。

如果方案content,那么Uri可以指向什么

  • 外部存储上的文件,你可以访问
  • 移动存储的文件,你不能访问
  • 另一个应用程序的内部存储器上的文件,您无法访问
  • 另一个应用程序的资产,它不是文件
  • BLOB列的数据库,这是不是一个文件
  • 是实时生成一个值,这个网页是这样的,这是不是一个文件
  • 内容将从被流化的A值互联网上,这是不
  • 等等

使用ContentResolveropenInputStream()(也许openOutputStream())的设备上的文件由Uri标识的内容合作。

+0

Hi CommonsWare。非常感谢你真的很好的答案。选择图像后,Uri被正确传回。但是当我尝试获取donwload文件夹中该图像的实际路径时,它会崩溃。这个问题似乎是特定于这个特定的文件夹。我不知道如何管理ContentResolver或openInputStream()。那么,我怎么能得到这个文件夹中的实际位置? – agustincola

+0

@agustincola:“我怎么能得到这个文件夹中的实际位置?” - 你没有。您可以使用'Uri'访问与内容相关的流,使用'ContentResolver'。这应该包含在你的Android应用程序开发书或课程中。它也包含在[文档](https://developer.android.com/training/secure-file-sharing/request-file.html)中。 – CommonsWare

+0

好的。感谢您的时间。 – agustincola

-1

也许我没有问好,因为我的英语。在研究了几个选项之后,最后我创建了一个适合我的好的解决方案。我强制打开图库图像,并且用户无法随时从Donwload文件夹下载。我在showFileChooser方法中执行下一步:

private void showFileChooser() { 
    if (Build.VERSION.SDK_INT <19){ 
     Intent intent = new Intent(); 
     intent.setType("image/jpeg"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.select_picture)),PICK_IMAGE_REQUEST); 
    } else { 
     Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i, PICK_IMAGE_REQUEST); 
    } 

我希望它对未来的某个人有用。