PathPattern для соответствия расширению файла не работает, если существует какой-либо период в другом месте имени файла?
Я вижу многочисленные примеры использования pathPattern для определения фильтра-намерения для определенного расширения/типа файла; например, pathPattern=".*\\.xyz"
.
К сожалению, это не работает должным образом, если файл, о котором идет речь, имеет период в другом месте пути; например, "my.filename.xyz".
Есть ли синтаксис pathPattern, который будет соответствовать как "myfilename.xyz", так и "my.filename.xyz"?
Ответы
Ответ 1
Команда android выбрала неудачный способ реализации pathPattern. Вы можете посмотреть, как сопоставление шаблонов реализовано в классе android.os.PatternMatch:
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/PatternMatcher.java
Мы привыкли. * Работаем так же, как и в регулярном выражении, где * match является жадным и будет соответствовать как можно большему количеству символов. В реализации PatterMatch совпадение не является жадным.. * Будет соответствовать столько символов, сколько может, пока не найдет соответствие для следующего символа в строке.
Пример:
Строка: "/mnt/my.file.mytype"
pathPattern: ". * \\. mytype"
". *" в pathPattern будет соответствовать подстроке "/mnt/my" и, следовательно, не будет соответствовать строке.
Учитывая это ограничение, я не вижу способа написать pathPattern, который может соответствовать любой строке, заканчивающейся ".mytype". Лучшее, что вы можете сделать, это следовать решению Jason, чтобы добавить дополнительные шаблоны для соответствия путям с таким количеством точек, сколько вы хотите указать шаблоны.
Ответ 2
Столкнулся с той же проблемой, пытаясь открыть файл в папке с точками. Я обнаружил, что могу просто добавить несколько элементов "данных", в зависимости от того, сколько точек я ожидаю иметь в моих путях:
<data android:pathPattern=".*\\.mytype"/>
<data android:pathPattern=".*\\..*\\.mytype"/>
<data android:pathPattern=".*\\..*\\..*\\.mytype"/>
<data android:pathPattern=".*\\..*\\..*\\..*\\.mytype"/>
Хотя уродливо. Кто-нибудь знает лучший способ?
Ответ 3
Я использовал это:
<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="*"
. Я не сделал подробного изучения этого. Но это работает для меня, надеюсь, что это поможет кому-то и там.