首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Uri读取文件给出java.io.FileNotFoundException:打开失败: ENOENT

从Uri读取文件给出java.io.FileNotFoundException:打开失败: ENOENT
EN

Stack Overflow用户
提问于 2016-03-11 14:40:31
回答 1查看 2.2K关注 0票数 1

当使用ACTION_GET_CONTENT意图选择图像时,我得到一个无法打开文件的URI。如果我试图打开这个文件,就像这样:

代码语言:javascript
复制
InputStream in = new FileInputStream(new File(uri.getPath()));

它提供了以下例外:

代码语言:javascript
复制
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看起来确实是一条不正确的路径,但是如何获得正确的路径呢?

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

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    ....
    Uri uri = data.getData();

我需要让文件做解码,以使它更小。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-11 14:44:36

如果我试图打开这个文件,就像这样:

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

我需要让文件做解码,以使它更小。

不需要有与给定的Uri相关联的文件。Uri可能会指出:

  • 外部存储上的本地文件
  • 另一个应用程序内部存储的本地文件
  • 可移动存储的本地文件
  • 加密并需要动态解密的本地文件。
  • 数据库中BLOB列中保存的字节流。
  • 一段需要由另一应用程序下载的内容
  • ...and等

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35942968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档