【问题标题】:Android- how can I convert android.net.Uri object to java.net.URI object?Android-如何将 android.net.Uri 对象转换为 java.net.URI 对象?
【发布时间】:2010-10-08 06:38:28
【问题描述】:

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

content://media/external/images/media/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());

【问题讨论】:

    标签: android uri android-bitmap fileinputstream


    【解决方案1】:

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

    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 设备上返回编码字符
    • @RémyDAVID 它没有。我刚试过。对于其中有空格的a.n.Uri,该空格not 被编码。自己试试吧:Uri.parse("content://foo.bar.com/0?file=my goodness").toString()。你是对的,javadocs声明它返回一个编码字符串,但它没有说明使用了哪种编码。
    【解决方案2】:

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

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

    就是这样!

    【讨论】:

    • 谢谢!!!如此简单,我知道它就在某个地方。接受的答案在某些情况下可能有效,但似乎并非在所有情况下都是安全/有效的。
    • 非常感谢!!!!当您需要从内置图库中挑选的图像中获取 byte[] 时,它可以作为一种魅力!
    • 这股力量关闭了我的应用程序并打开了没有附加源的 Binder.class。我正在发送 Contacts.CONTENT_VCF_URI
    【解决方案3】:

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

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

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

    如果您需要更多详细信息,请看这里:

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

    【讨论】:

      【解决方案4】:

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

      特别是这个方法从 Uri 提供 InputStream:

      public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
      

      【讨论】:

        【解决方案5】:

        由于 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 类抛出异常的原因。

        【讨论】:

        • 谢谢布赖恩。 uri 由 android 本身返回。它包含手机图片库中图像的路径。所以不能对图像做任何事情。我会尝试在问题中发布 uri
        • 我想你的意思是 getScheme 和 getSchemeSpecificPart,对吧?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 2018-02-13
        相关资源
        最近更新 更多