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 [关闭]
Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器