我已经阅读了很多其他关于这个问题的文章 - 特别是这个问题的高票答案:Android intent filter for a particular file extension?
我的情况比较简单 - 我只是想匹配我们网站上的特定文件名 - 例如http://our_domain/filename.extn
- 但考虑到一些细微的差异(我在下面进一步指出)。
我的 Intent 过滤器编写如下:
<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
- 我已经删除了这个问题的这些内容,因为它对此周期匹配的行为没有影响。
Intent 过滤系统实际上不支持匹配仅文字.
字符(不是设计原因而是错误),并且它们会总是被视为“任何”?
最佳答案
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 错误。我刚刚浏览了android的PatternMatcher的源代码这种行为(错误?)至今仍然存在。
即看起来匹配 .
文字仅在一种情况下有效 - 当它前面有 *
表达式时。只有这样才正确escaped in code - \\
被考虑在内)。这就是为什么人们只是想 match a file extension能够使用这样的模式:
<data android:pathPattern=".*\\.ext" />
一旦转义序列 (\\
) 前面有 *
以外的内容,转义为 not taken into account点 (.
) 被视为通配符而不是文字并匹配任何字符。
我一直在考虑是否应该报告这个错误,但考虑到很少有人遇到这个错误,这可能不值得。我寻找类似的问题,但没有找到。此外,.
通配符甚至没有在 documentation 中被提及为有效通配符。 。根据文档,唯一有效的通配符是 .*
和 *
.
关于android - Intent 过滤器中的路径模式匹配文字期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19516994/