Android-如何将android.net.Uri对象转换为java.net.URI对象?

时间:2009-02-18 05:05:19

标签: android

我正在尝试在用户从图片库中选择的图片上获得FileInputStream个对象。这是URI

返回的android android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

内容://媒体/外部/图像/媒体/ 3

当我尝试从这个对象构造一个java URI对象时,我得到一个IllegalArgumentException,异常描述 URI中的预期文件方案:content:// media / external / images / media / 3 而android URI将方案显示为 content

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

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

5 个答案:

答案 0 :(得分:49)

您可以结合使用基于toString的{​​{1}} Uri构造函数来使用android String的{​​{1}}方法。

URI

Android URI | Java URI

答案 1 :(得分:39)

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

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

这就是全部!

答案 2 :(得分:2)

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

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

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

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

    How to delete a video recorded using an Intent with ACTION_VIDEO_CAPTURE?

答案 3 :(得分:2)

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

特别是这个方法提供了来自Uri的InputStream:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)

答案 4 :(得分: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类抛出异常的原因。