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

Android Uri.fromParts和Uri.parse之间的区别?,android,email,android-intent,uri,Android,Email,Android Intent,Uri,我正在为Android创建一个发送电子邮件的意图 我对Uri.fromParts的行为感到困惑 Mi代码: 这个很好用 uri=Uri.parse( "mailto:" + toAddress + (subject != null ? ("?" + "subject=" + Uri.encode(subject)) : "") 前面的工作很好,并以mailto:john@doe.

我正在为Android创建一个发送电子邮件的意图

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

Mi代码: 这个很好用

uri=Uri.parse(
  "mailto:" + toAddress +
    (subject != null ?
      ("?" + "subject=" + Uri.encode(subject)) :
      "")
前面的工作很好,并以
mailto:john@doe.com?主题=测试

但如果我尝试使用Uri.from parts,则使用以下示例:

uriBuilder=Uri.fromParts("mailto",toAddress,null).buildUpon();
if (subject!=null) {
    uriBuilder.appendQueryParameter("subject",subject);
}
uri=uriBuilder.build();
我犯了一个错误。最后的uri是
mailto:?subject=Test

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

你知道为什么吗?哪一种是实现这一点的标准方法?

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

在此调用
buildOn()
时,
Builder
包含方案、方案特定部分(ssp)和片段(本例中为空)

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

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


有关发动机罩下发生的情况的详细信息,请阅读。

非常感谢您的回答!它添加了一个新的概念(至少对我来说是新的):分层URI和非分层URI。但是,接受这一点,如果appendQueryParameter将损坏非层次结构的参数,为什么不生成异常呢。我必须打开一个事件吗?