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

谢谢你的帮助。

我想获得一个FileInputStream对象的图片,用户从图片库中select。 这是android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI返回的android URI

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

当我尝试从这个对象构造一个java URI对象时,我得到一个IllegalArgumentExceptionexception描述URI:content:// media / external / images / media / 3中的Expected file scheme,而android URI显示scheme为内容

从来没有find原来的问题的解决scheme。 但是,如果你想在图片库中的图像的字节stream,这段代码将做到这一点。

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

您可以将基于String的Java URI构造函数与android UritoString方法结合使用。

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

Android URI | Java URI

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

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

就这样!

有一个解决您的原始问题(转换URI到URI):

  1. 获取真正的文件path(看这个代码: 从mediastore的URI获取文件名和path )

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

如果您需要更多的细节,请看这里:

如何用ACTION_VIDEO_CAPTURE删除使用Intent录制的video?

我投了jgilrincon的回答。 我不能评论由于低信誉,这里有一些额外的信息 – 你可以使用Apache Cordova项目中的FileHelper.java ,它具有你需要从Uristring处理文件的function,考虑到mediastore(以及app资源文件夹)

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

 public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 

由于string构造不起作用,你试图只是构build你自己?

 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类中获取有效数据。 在我的其他答案中列出的文档讨论它几乎没有错误检查。 如果实际上有一个错误,这个类只是吐出​​垃圾,不会抛出任何exception。 这很可能是为什么做validation的java类抛出一个exception。