【问题标题】:Reading File from Uri gives java.io.FileNotFoundException: open failed: ENOENT从 Uri 读取文件给出 java.io.FileNotFoundException: open failed: ENOENT
【发布时间】:2016-06-26 20:39:05
【问题描述】:

使用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();

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

【问题讨论】:

    标签: android image uri filenotfoundexception


    【解决方案1】:

    如果我尝试打开文件,像这样:

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

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

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

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

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

    【讨论】:

    • 太棒了。我只是对这些 uri 的工作方式有一个误解。
    • @wvdz:是的,最好将它们视为不透明的句柄,类似于网站的 URL。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2013-07-12
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多