gpt4 book ai didi

android - intent-filter 中的 pathPattern 匹配字面量

转载 作者:行者123 更新时间:2023-11-29 00:25:53 27 4
gpt4 key购买 nike

我已经阅读了很多关于此的其他 SO - 特别是对这个问题的高度投票回答:Android intent filter for a particular file extension?

我的场景比较简单——我只想匹配我们网站上的特定文件名——例如http://our_domain/filename.extn - 但考虑到大小写上的一些小差异(我在下面进一步说明)。

我的 intent-filter 是这样写的:

<data 
android:scheme="http"
android:host="our_domain"
android:pathPattern="/filename\\.extn" />

\ 进行两次转义,以便将其作为 \. 从 XML 中读出,从而转义句点,以便模式匹配器看到文字 . 而不是“任何”字符。

为了我的测试,我编写了一个小应用程序,它从文本框中获取一个字符串,使用给定的 URI 创建一个 ACTION_VIEW Intent ,然后启动它 - 然后检查浏览器是否启动或我是否看到列出了我的应用程序的选择器。

已正确识别应用的确切路径 - 例如http://our_domain/filename.extn,但如果我将 . 替换为 URI 路径中有效的任何其他字符,它也会被识别 - 例如,所有以下也会触发匹配:

  • http://our_domain/filename'extn
  • http://our_domain/filename~extn
  • http://our_domain/filenameaextn

最后一个最让人担心!

如何设置路径模式以确保一个字面句点匹配?

请注意我知道简单地使用 path 而不是 pathPattern 可能有效 -但是,该模式还包含一些不区分大小写的小问题 - 例如F*f*ileN*n*ame - 我已经删除了这个问题的内容,因为它对这个句点匹配的行为没有影响。

是否有可能匹配 only 文字 . 字符实际上不被 intent-filter 系统支持(不是设计而是错误),并且他们会总是被视为“任何”?

最佳答案

Is it possible that matching only literal. characters is actually not supported by the intent-filter system (not by design but by bug), and that they'll always be treated as 'any'?

是的,这看起来像一个 android bug。我刚刚浏览了 android 的源代码 PatternMatcher并且这种行为(错误?)一直存在到今天。

即看起来匹配 . 文字只适用于一种情况 - 当它前面有 * 表达式时。只有这样才是正确的escaped in code - \\ 被考虑在内)。这就是为什么人们只是想 match a file extension能够使用这样的模式:

<data android:pathPattern=".*\\.ext" />

只要转义序列 (\\) 前面不是 *,转义就是 not taken into account并且点 (.) 被视为通配符而不是文字并匹配任何字符。

我一直在考虑是否应该报告这个错误,但考虑到遇到它的人很少,这可能不值得。我寻找类似的 SO 问题,但没有找到任何问题。此外,. 通配符在 documentation 中甚至没有被提及为有效通配符。 .根据文档,唯一有效的通配符是 .**.

关于android - intent-filter 中的 pathPattern 匹配字面量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19516994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com