从Uri读取文件会产生java.io.FileNotFoundException:open failed:ENOENT

时间:2016-03-11 14:40:32

标签: android image uri filenotfoundexception

使用ACTION_GET_CONTENT意图选择图像时,我得到一个无法打开文件的URI。如果我尝试打开文件,请执行以下操作:

InputStream in = new FileInputStream(new File(uri.getPath()));

它提供以下例外:

03-11 15:14:36.132  20557-20557/my.package W/System.err﹕ java.io.FileNotFoundException: /document/image:9537: open failed: ENOENT (No such file or directory)
03-11 15:14:36.138  20557-20557/my.package W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)
03-11 15:14:36.138  20557-20557/my.package W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:76)

/document/image:9537似乎确实是一条错误的路径,但我如何获得正确的路径?

我使用这个逻辑来打开图像选择器:

Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
photoPickerIntent.setType("image/*");
photoPickerIntent.putExtra("return-data", false);
startActivityForResult(Intent.createChooser(photoPickerIntent, "Complete action using"), PICK_FROM_FILE);

并在onActivityResult中检索Uri,如下所示:

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    ....
    Uri uri = data.getData();

我需要让文件进行解码以使其变小。

1 个答案:

答案 0 :(得分:3)

  

如果我尝试打开文件,请执行以下操作:

这对大多数现代Android设备都不起作用。最有可能的是,您收到了content: Uri。这在较新版本的Android上相当正常。 Android的未来版本可能会阻止file: Uri值。

  

我需要让文件进行解码以使其变小。

没有与给定Uri关联的文件。 Uri可能指向:

  • 外部存储设备上的本地文件
  • 其他应用的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 加密且需要动态解密的本地文件
  • 数据库中BLOB列中保存的字节流
  • 首先需要由其他应用下载的内容
  • ......等等

使用ContentResolveropenInputStream()获取InputStream指向的内容Uri。然后,将其传递给解码逻辑,例如BitmapFactory及其decodeStream()方法。