【问题标题】:How to convert String to Uri if it has % in it?如果其中包含 %,如何将 String 转换为 Uri?
【发布时间】:2023-01-30 09:07:32
【问题描述】:

我在将此字符串“content://com.android.providers.media.documents/document/image%3A1000002538”正确转换为 Uri 时遇到问题。

情况:

我递减了一个 Uri

  • 第一的,我将 Uri 转换为字符串,然后转换为 int

    之后,我做了一个-1,然后我得到了一个看起来完全像递减字符串的字符串

    然而,当我解析 uri 并尝试对其进行 setImageURI() 时,

    它正在显示“文件错误访问最近的目录(目录
    不存在?)

这是我使用的代码:

            Uri ImageUri = data.getData();
            String uri1 = ImageUri.toString();

            //region uri2
            String substr1 = uri1.substring(uri1.length()-3);
            int substr1int = parseInt(substr1)-1;
            String decrementedstr1 = new Integer(substr1int).toString();
            int numberofchars1 = uri1.length()-3;
            String firstcomponent1 = uri1.substring(0, numberofchars1);
            String uri2 = firstcomponent1 + decrementedstr1;


            //endregion
            Uri test = Uri.parse(uri2);
            animateobject.setImageURI(test);

得到这个错误:

访问最近目录的文件错误(目录不存在?)。

注意:这是在 java 中,我正在使用 Android Studio 进行编码。

【问题讨论】:

  • 不,你从哪里得到那个字符串?这是一个不可能的内容方案。
  • Uri来自哪个班级?
  • @blackapps 这是一个例子.. 我得到的真实 uri 是.. content://com.android.providers.media...../document/image%3A1000002538 。我需要将数字递增 1,因此我必须将其转换为字符串并将其解析回 uri。问题是 %3A 导致我的字符串被转换为 uri 的错误目录。
  • @JohnWilliams MainActivity 类
  • 这样做:System.out.println(java.net.URLDecoder.decode("content://image%3A1000002539", StandardCharsets.UTF_8.name())); .请注意,%3A 变成了 : - 不确定是否解决了问题

标签: java android string uri percentage


【解决方案1】:

让我们先弄清楚一些事情。 % 字符是什么意思?

好吧...如果您查看 URI 规范 (RFC ....),% 是一个 percent encoding 标记。 % 之后的两个字符是十六进制数字,整个表示一个 ASCII 字符。实际上,%3A 代表冒号字符 (:)。所以该 URI 的未编码的“不透明”组件实际上是

//com.android.providers.media.documents/document/image:1000002538

因此,图像(文档)编号为真的1000002538 并递减它应该给出 1000002537 作为图像编号。

我不完全确定为什么你的“string bashing”方法失败了,但你只是减少了图像编号的最后 3 位数字......而你的例子在右端有 4 位有效数字。

所以这就是你的方式应该代码:

        Uri imageUri = data.getData();
        String[] pathSegments = imageUri.getSchemeSpecificPart().split("/");
        String lastSegment = pathSegments[pathSegmentslength - 1);

        String[] parts = lastSegment.split(":");
        assert parts.length == 1 && "image".equals(parts[0]);
        long imageNo = Long.parseLong(parts[1]);
        imageNo--;
        lastSegment = "image:" + imageNo;

        pathSegments[pathSegments.length - 1] = lastSegment;
        String path = String.join("/", pathSegments);
        imageUri = Uri.Builder().scheme("content").opaquePart(path).build();

通过调用getSchemeSpecificPart(),我们得到了 URI 的相关部分,并解码了百分比编码。同样,Builder 将根据需要重新应用编码。

注意事项

  1. 此代码未经编译或测试。我没有 Android 开发平台。
  2. 对于非 Android 用户,这是使用 Android Uri 类而不是 Java SE URI 类!

【讨论】:

  • 我试过了,它甚至对 setText() 都不起作用。错误显示:java.lang.AssertionError
  • 这是一个很好的答案。但是,这一行似乎有错误: assert parts.length == 1 && "image".equals(parts[0]);
  • 所以...看看parts 的元素是什么。就像我说的,我无法调试代码。 (我假设你明白目的assert 声明的...)
  • 提示:在assert 之前添加一些跟踪打印或日志记录,以显示您需要查看的信息。或者使用调试器,单步执行代码的相关部分并检查变量。 (这是一个面向程序员的问答网站。假设您已经知道如何做这些事情,或者可以自学如何做。)
  • 谷歌搜索后我已经完全理解了。尽管如此,当我使用 imageUri = Uri.Builder().scheme("content").opaquePart(path).build(); 时,我得到了一个空白图像;
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多