Android 从Uri读取文件会给出java.io.FileNotFoundException:打开失败:eNot

Android 从Uri读取文件会给出java.io.FileNotFoundException:打开失败:eNot,android,image,uri,filenotfoundexception,Android,Image,Uri,Filenotfoundexception,当使用ACTION\u GET\u CONTENTintent拾取图像时,我会得到一个无法从中打开文件的URI。如果我尝试打开该文件,如下所示: InputStream in = new FileInputStream(new File(uri.getPath())); public void onActivityResult(int requestCode, int resultCode, Intent data) { .... Uri uri = data.getData(

当使用
ACTION\u GET\u CONTENT
intent拾取图像时,我会得到一个无法从中打开文件的URI。如果我尝试打开该文件,如下所示:

InputStream in = new FileInputStream(new File(uri.getPath()));
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    ....
    Uri uri = data.getData();
它给出了以下例外情况:

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)
并在onActivityResult中检索Uri,如下所示:

InputStream in = new FileInputStream(new File(uri.getPath()));
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    ....
    Uri uri = data.getData();
我需要对文件进行解码,使其更小

如果我尝试打开该文件,如下所示:

InputStream in = new FileInputStream(new File(uri.getPath()));
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    ....
    Uri uri = data.getData();
这对大多数现代安卓设备都不起作用。您很可能收到了
内容:
Uri
。这在较新版本的Android上相当正常。Android的未来版本可能会阻止
文件:
Uri

我需要对文件进行解码,使其更小

不必存在与给定的
Uri
关联的文件。
Uri
可能指向:

  • 外部存储器上的本地文件
  • 另一个应用程序的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 加密的本地文件,需要动态解密
  • 数据库中
    BLOB
    列中保存的字节流
  • 需要先由其他应用程序下载的内容
  • ……等等

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

这太棒了。我只是对这些uri的工作方式有一个误解。@wvdz:是的,最好将它们视为不透明句柄,类似于网站的URL。