我正在尝试在用户从图片库中选择的图片上获得FileInputStream
个对象。这是URI
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());
答案 0 :(得分:49)
答案 1 :(得分:39)
找到从内容URI打开InputStream的正确方法:
InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri);
这就是全部!
答案 2 :(得分:2)
您的原始问题有一个解决方案(将Uri转换为URI):
获取真实文件路径(查看此代码:Get filename and path from URI from mediastore)
使用真实路径和构造函数获取URI:URI(String uri)
如果您需要更多详细信息,请查看此处:
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类抛出异常的原因。