【问题标题】:UriMatcher matching wilcard? (Crash in Android mail app)UriMatcher 匹配通配符? (Android 邮件应用程序崩溃)
【发布时间】:2021-11-03 23:36:36
【问题描述】:

我在 android 邮件应用程序中遇到崩溃,我追溯到 UriMatcher 未能匹配 URI。

相关代码:

UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sURIMatcher.addURI(EmailContent.AUTHORITY, "uiattachmentbycid/#/*", UI_ATTACHMENT_BY_CID);
int match = sURIMatcher.match(uri);
if (match < 0) {
    throw new IllegalArgumentException("Unknown uri: " + uri);
}

这失败了

java.lang.IllegalArgumentException:未知 uri: content://com.android.email.provider/uiattachmentbycid/4127/assets/img/filiale-icon@2x.png

查看https://github.com/aosp-mirror/platform_packages_apps_email/blob/134e092c9b71d8145ba8c7540bac0c392630218f/provider_src/com/android/email/provider/EmailProvider.java#L1223获取完整源代码

知道这里有什么问题吗?

【问题讨论】:

  • EmailContent.AUTHORITY 的设置似乎很奇怪,所以也许它与com.android.email.provider 不匹配。
  • 我在那里放了一个调试 printf 并且权限确实是 com.android.email.provider 看来问题是斜杠的数量不同。检查 UriMatcher 的代码,它会遍历所有 uri 组件并尝试找到匹配的节点。添加的 URI 仅匹配“content://com.android.email.provider/uiattachmentbycid/4127/assets”,但之后的所有内容都没有匹配部分。 IE。 “*”不匹配斜线

标签: android uri


【解决方案1】:

这似乎是电子邮件应用程序本身的一个实际错误。 本例中的 Mail-Source 包含 &lt;img src="cid:assets/img/filiale-icon@2x.png"&gt; 和带有 Content-ID: &lt;assets/img/filiale-icon@2x.png&gt; 的附件

根据 RFC 2045 和 822,这是有效的:

  • id := "Content-ID" ":" msg-id
  • msg-id = "&lt;" addr-spec "&gt;"
  • addr-spec = local-part "@" domain
  • local-part = word *("." word)
  • word = atom / quoted-string
  • atom = 1*&lt;any CHAR except specials, SPACE and CTLs&gt;
  • CHAR = &lt;any ASCII character&gt; ; ( 0-177, 0.-127.)

https://www.rfc-editor.org/rfc/rfc822#appendix-D

所以这里非常允许使用斜线。

因此这里不能使用 UriParser,因为最后一部分(星号)可能包含 UriParser 无法处理的斜线

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多