65

我正在尝试获取FileInputStream用户从图片库中选择的图像上的对象。URI这是返回的 androidandroid.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

content://media/external/images/media/3

当我尝试从这个对象构造一个 java URI 对象时,我得到一个IllegalArgumentException异常描述Expected file scheme in URI: content://media/external/images/media/3而android URI将该方案显示为内容

更新:从未找到原始问题的解决方案。但是如果你想要图片库中图像的字节流,这段代码就可以做到。

Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray());
4

5 回答 5

61

您可以结合Java 的基于构造函数使用toStringandroid 的方法。UriStringURI

android.net.Uri auri = new android.net.Uri(what ever);
java.net.URI juri = new java.net.URI(auri.toString());

Android URI | Java URI

于 2009-02-18T06:03:37.653 回答
43

找到从内容 URI 打开 InputStream 的正确方法:

InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri);

就这样!

于 2009-04-24T06:03:03.420 回答
3

您的原始问题有一个解决方案(将 Uri 转换为 URI):

  1. 获取真实的文件路径(看这段代码:Get filename and path from URI from mediastore

  2. 使用真实路径和构造函数获取 URI:URI(String uri)

如果您需要更多详细信息,请查看此处:

如何删除使用带有 ACTION_VIDEO_CAPTURE 的 Intent 录制的视频?

于 2011-06-30T11:45:15.517 回答
2

我投票支持 jgilrincon 的回答。由于声誉低,我无法发表评论,这里有一些额外的信息 - 您可以使用Apache Cordova 项目中的FileHelper.java,它具有从 Uri 字符串处理文件所需的功能,同时考虑到 mediastore(和应用程序资产文件夹)

特别是此方法提供来自 Uri 的 InputStream:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
于 2013-09-19T18:43:31.623 回答
0

由于 String 构造不起作用,您是否尝试过自己构造它?

android.net.URI auri = new android.net.URI(what ever);
java.net.URI juri = new java.net.URI(auri.getSchema(),
                                     auri.getSchemaSpecificPart(),
                                     auri.getFragment());

您可能还想仔细检查您是否从 Android URI 类中获取了有效数据。我的其他答案中列出的文档讨论了它如何几乎不进行错误检查。如果实际上存在错误,则该类无论如何都会吐出垃圾并且不会抛出任何异常。这很可能是执行验证的 java 类抛出异常的原因。

于 2009-02-19T14:15:09.990 回答