我看到很多使用pathPattern来定义特定文件扩展名/类型的intent-filter的例子,例如 pathPattern=".*\\.xyz"
。
不幸的是,如果路径中的文件在其他地方有一个句点(比如"my.filename.xyz"),这种方法似乎不能正常工作。
是否有一种pathPattern语法可以同时匹配"myfilename.xyz"和"my.filename.xyz"?
我看到很多使用pathPattern来定义特定文件扩展名/类型的intent-filter的例子,例如 pathPattern=".*\\.xyz"
。
不幸的是,如果路径中的文件在其他地方有一个句点(比如"my.filename.xyz"),这种方法似乎不能正常工作。
是否有一种pathPattern语法可以同时匹配"myfilename.xyz"和"my.filename.xyz"?
尝试在点文件夹中打开文件时遇到了相同的问题。我发现只需添加多个"data"元素,取决于我期望路径中有多少个点:
<data android:pathPattern=".*\\.mytype"/>
<data android:pathPattern=".*\\..*\\.mytype"/>
<data android:pathPattern=".*\\..*\\..*\\.mytype"/>
<data android:pathPattern=".*\\..*\\..*\\..*\\.mytype"/>
不过有点丑,有人知道更好的方法吗?
Android团队在实现pathPattern时选择了一种不幸的方式。您可以查看android.os.PatternMatch类中如何实现模式匹配:
我们习惯于使用.*和正则表达式中的贪婪模式相同,即尽可能匹配尽可能多的字符。在PatternMatch的实现中,匹配不是贪婪的。 .*将尽可能匹配尽可能多的字符,直到它找到字符串中下一个字符的匹配项为止。
例如:
字符串:"/mnt/my.file.mytype"
pathPattern:" .*\\.mytype "
在pathPattern中的“.*”将匹配子字符串“/mnt/my”,因此无法匹配该字符串。
鉴于这个限制,我没有找到一种方法来编写一个pathPattern,能够匹配以“.mytype”结尾的任何字符串。最好的方法是遵循Jason的解决方案,添加额外的模式以匹配具有尽可能多点的路径,只要您愿意指定模式即可。
<activity
android:name=".activity.GifActivity"
android:label="Cool Player ^_^">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
<data android:scheme="https" />
<data android:host="*"/>
<data android:pathPattern="/.*\\.mp4"/>
</intent-filter>
</activity>
这将打开以下网址:
以下网址则不会打开:
我认为这里的关键是 host =“*”
。 我没有对此进行深入研究,但对我有用,希望能帮助到其他人。
<data android:pathPattern="[.*\\.]+mytype"/>
这个怎么样?它如果像正则表达式一样工作,那么这个也可能行得通:<data android:pathPattern="\\.mytype$"/>
? - Sourabh