匹配文件扩展名的pathPattern不起作用,如果一个句点存在于文件名的其他地方?

我看到很多使用pathPattern为特定文件扩展名/types定义意图filter的例子; 例如, pathPattern=".*\\.xyz"

不幸的是,如果有问题的文件在path的其他地方有一段时间,这似乎不能正常工作。 例如“my.filename.xyz”。

是否有一个pathPattern语法将匹配“myfilename.xyz”和“my.filename.xyz”?

android团队select了一个不幸的方式来实现pathPattern。 你可以看看在android.os.PatternMatch类中如何实现模式匹配:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/PatternMatcher.java

我们已经习惯了。*像在正则expression式中那样工作,其中*匹配是贪婪的并且将匹配尽可能多的字符。 在PatterMatch的实现中,匹配不是贪婪的。 。*将匹配尽可能多的字符,直到findstring中下一个字符的匹配。

例:

string:“/mnt/my.file.mytype”
pathPattern:“。* \\。mytype”

pathPattern中的“。*”将匹配子string“/ mnt / my”,因此将无法匹配string。

鉴于此限制,我没有看到写一个pathPattern的方式,可以匹配以“.mytype”结尾的任何string。 你可以做的最好的方法就是按照Jason的解决scheme,添加更多的模式来匹配具有尽可能多点的path,因为你愿意指定模式。

跑到同一个问题试图打开一个点文件夹中的文件。 我发现我可以添加多个“数据”元素,具体取决于我的path中预期有多less个点:

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

丑,但。 任何人都知道更好的方法?

我用这个:

 <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> 

这将打开以下url:

不会为以下内容打开:

我认为这里的关键是host="*" 。 我对此没有深入研究。 但它对我有用,希望它也能帮助别人。