Android Uri 构建忽略参数,除非至少存在一个参数

Posted

技术标签:

【中文标题】Android Uri 构建忽略参数,除非至少存在一个参数【英文标题】:Android Uri building ignore parameters except if at least one parameter is present 【发布时间】:2021-07-15 09:51:40 【问题描述】:

当我单击 Web 视图中的 PDF 文件链接时,我的行为很奇怪。 例如:https://my.server.com/foobar.pdf

所以我做了一些研究,这个链接将在我的 webview 中开始下载。 我有一个 DownloadListener 和一个 onDownloadStart 方法。 在其中,我将 URL 发送到 android,以便手机上的 PDF 应用程序可以打开它。

我的奇怪行为在这里。如果 web 视图中的链接没有参数,我无法在 URL 中添加参数但是如果 URL 有一个参数 -> 我的参数已添加。

例子会更有意义。

链接中的url 是“https://my.server.com/foobar.pdf”

val uriTest = Uri.parse(url).buildUpon()
    .appendQueryParameter("key1", val1)
    .appendQueryParameter("key2", val2)
    .build()
val intent = Intent(Intent.ACTION_VIEW, uriTest) 
startActivity(intent)

因此,当startActivity(intent) 调用的 PDF 应用程序在我的服务器上调用 URL 时,我的 URL 中没有参数,而在我的服务器上,我看到了对“https://my.server.com/foobar.pdf”的调用 不要“https://my.server.com/foobar.pdf?key1=val1&key2=val2”。

但是

如果在我的服务器端执行我的 Android 代码时链接中的 url 是“https://my.server.com/foobar.pdf?t=t”,我可以看到对“”https: //my.server.com/foobar.pdf?t=t&key1=val1&key2=val2"。我的参数是在这种情况下添加的。

正常吗?我错过了什么吗?

感谢您的帮助!

---编辑--- 我还尝试直接在字符串中添加我的参数,它是相同的 -> 我的参数被忽略,直到我得到的 URL 有一个参数。 示例:我得到“https://my.server.com/foobar.pdf”并且我做到了:

val url1 = url + "?key1=" + val1
or
val url1 = "$url?key1=$val1"

【问题讨论】:

【参考方案1】:
    val yourUrl = StringBuilder("https://my.server.com/foobar.pdf")
    val parameters = hashMapOf<String, String>()
    parameters["key1"] = "val1"
    parameters["key2"] = "val2"

    var count = 0
    for (i in parameters.entries) 
        if (count == 0)
            yourUrl.append("?$i.key=$i.value&")
        else
            yourUrl.append("$i.key=$i.value&")
        count++
    

    val yourNewUrl = yourUrl.substring(0, yourUrl.length - 1)
    Timber.e("URL: $yourNewUrl")

    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(yourNewUrl))
    startActivity(intent)

编码愉快:)

【讨论】:

感谢您的帮助 :) 但是我尝试将我的参数作为字符串直接添加到 url 中(就像您在此处所做的那样)并且没有任何效果......只有当我得到的 URL 已经有一个参数时...(我将在我的问题中添加此信息) 我只是编辑了答案。如果这不是您想要的,那么只需向我展示您在添加参数后想要获得的最终链接。 是的,这在下面不起作用...我的意思是我可以在 Android 端添加参数,但在服务器端,如果我得到它时 url 没有一个参数,则不会发送参数。我想要的网址很简单my.server.com/foobar.pdf?key1=val1&key2=val2。当然,您的代码就像直接将它们添加到字符串中一样工作,但在服务器端我没有获取参数

以上是关于Android Uri 构建忽略参数,除非至少存在一个参数的主要内容,如果未能解决你的问题,请参考以下文章

未找到“应用程序”的变体。检查构建文件以确保至少存在一种变体:Android Studio [关闭]

颤振 | Dart:URI的目标不存在

Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器

如何在 PHP 中识别请求的页面

Ruby URI:使用“param[]=value”为数组参数构建 URI

自定义选择器活动:SecurityException UID n 没有对 content:// uri 的权限