我试图在用户从图片库中选择的图像上获得FileInputStream对象。 这是android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI返回的android URI
content://media/external/images/media/3
当我尝试从这个对象构造一个java URI对象时,我得到一个带有异常描述的IllegalArgumentException: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());
您可以结合使用基于Uri的Java Uri构造函数来使用android Uri的toString方法。
android.net.Uri auri = new android.net.Uri(what ever);
java.net.URI juri = new java.net.URI(auri.toString());
Android URI |
Java URI
谢谢。试过了。它给出了一个异常(java.net.URI应该有一个有效的方案)
这是错误的,如果URI包含需要编码的字符(如空格),则会失败。 android.net.Uri.toString()解码编码字符,如果你尝试在非编码字符串上构造它,java.net.URI将抛出异常。正确的解决方案huri = new java.net.URI(URLEncoder.encode(auri.toString(),"UTF-8"));
@Jeffrey:Uri.toString()在我的Android 4.1.2设备上返回编码字符
@RmyDAVID它没有。我试过了。对于带有空格的a.n.Uri,空间不会被编码。自己试试:Uri.parse("content:foo.bar.com0?file=my goodness").toString()。你是正确的,javadocs声明它返回一个编码的字符串,但它没有说明使用了什么样的编码。
找到从内容URI打开InputStream的正确方法:
InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri);
就这样!
谢谢!!!这么简单,我知道它在某处。接受的答案在某些情况下可能有效,但在所有情况下似乎都不安全/有效。
非常感谢!!!!当您需要从内置库中拾取的图像中获取byte []时,可以充当魅力!
此力关闭我的应用程序并打开Binder.class,没有附加任何来源。我发送的是Contacts.CONTENT_VCF_URI
我投了jgilrincon的回答。我不能评论由于声誉低,这里有一些额外的信息 - 您可以使用Apache Cordova项目的FileHelper.java,它具有从Uri字符串处理文件所需的功能,同时考虑到mediastore(以及app assets文件夹) )
特别是这个方法提供了来自Uri的InputStream:
public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
您的原始问题有一个解决方案(将Uri转换为URI):
获取真正的文件路径(查看此代码:从mediastore获取URI的文件名和路径)
使用实际路径和构造函数获取URI:URI(String uri)
如果您需要更多详细信息,请查看此处:
如何使用ACTION_VIDEO_CAPTURE删除使用Intent录制的视频?
由于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类抛出异常的原因。
谢谢Brian。 uri由android本身返回。它包含手机图片库中图像的路径。所以不能对图像做任何事情。我试着在问题中发布uri
我认为你的意思是getScheme和getSchemeSpecificPart,对吗?