Uri.fromParts 和 Uri.parse 之间的区别?

Posted

技术标签:

【中文标题】Uri.fromParts 和 Uri.parse 之间的区别?【英文标题】:DIfference between Uri.fromParts and Uri.parse? 【发布时间】:2018-07-07 04:37:35 【问题描述】:

我正在为 android 创建一个 Intent,用于发送电子邮件。

我对 Uri.fromParts 的行为感到困惑。

小米代码: 这很好用!

uri=Uri.parse(
  "mailto:" + toAddress +
    (subject != null ?
      ("?" + "subject=" + Uri.encode(subject)) :
      "")

之前的工作没问题,并以mailto:john@doe.com?subject=Test的形式创建一个Uri

但如果我尝试使用 Uri.from 部件,使用此示例:

uriBuilder=Uri.fromParts("mailto",toAddress,null).buildUpon();
if (subject!=null) 
    uriBuilder.appendQueryParameter("subject",subject);

uri=uriBuilder.build();

我得到一个错误。最后的uri是mailto:?subject=Test

中间是正确的,但是当我使用appendQueryParameter时,它删除了mailto方案之后的内容。

你知道为什么吗?执行此操作的规范方法是什么?

【问题讨论】:

【参考方案1】:

Uri#fromParts()

从给定的组件创建一个不透明的 Uri。对 ssp 进行编码,这意味着此方法不能用于创建分层 URI。

当您对此调用 buildUpon() 时,Builder 包含方案、方案特定部分 (ssp) 和片段(在您的情况下为 null)。

appendQueryParameter() 然后将Builder 转换为分层结构,删除不透明的 ssp 数据。

我认为没有“规范”的方式。只是不要混合分层和不透明的构建器。

有关幕后发生的事情的详细信息,请阅读source。

【讨论】:

非常感谢您的回答!它添加了一个新概念(至少对我来说是新概念):分层与非分层 Uris。但是,接受这一点,为什么,如果 appendQueryParameter 会破坏非分层的,为什么不产生异常。我必须打开事件吗? 另见***.com/questions/31635991/…

以上是关于Uri.fromParts 和 Uri.parse 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Android中的Uri.parse()

Android 中Uri.parse()的作用

Uri.parse使用本地IP地址

在 getContentResolver().query 中为 Uri.parse("content://sms/inbox") 设置日期标准

将字符串转换为 Uri

Flutter 区分开发环境和生产环境