pathPattern для сопоставления с расширением файла не работает, если в другом месте имени файла существует точка?
Я вижу многочисленные примеры использования pathPattern для определения фильтра намерений для определенного расширения / типа файла; например, pathPattern=".*\\.xyz"
,
К сожалению, это, кажется, не работает должным образом, если у рассматриваемого файла есть точка в другом месте в пути; например "my.filename.xyz".
Существует ли синтаксис pathPattern, который будет соответствовать как "myfilename.xyz", так и "my.filename.xyz"?
3 ответа
Команда Android выбрала неудачный способ реализации pathPattern. Вы можете посмотреть, как реализовано сопоставление с образцом в классе android.os.PatternMatch:
Мы привыкли.* Работать так же, как и в регулярном выражении, где * match жадный и будет соответствовать как можно большему числу символов. В реализации PatterMatch совпадение не является жадным..* Будет соответствовать как можно большему числу символов, пока не найдет совпадение для следующего символа в строке.
Пример:
Строка: "/mnt/my.file.mytype"
pathPattern: ".* \\. mytype"
".*" В pathPattern будет соответствовать подстроке "/ mnt / my" и, следовательно, не сможет соответствовать строке.
Учитывая это ограничение, я не вижу способа написать pathPattern, который может соответствовать любой строке, заканчивающейся на ".mytype". Лучшее, что вы можете сделать, это следовать решению Джейсона, чтобы добавить дополнительные шаблоны, чтобы сопоставить пути с таким количеством точек, сколько вы хотите указать шаблоны.
Столкнулся с той же проблемой, пытаясь открыть файл в папке с точками. Я обнаружил, что могу просто добавить несколько элементов "данных", в зависимости от того, сколько точек я ожидал иметь в моих путях:
<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:
- http://i.imgur.com/6162727/2727727/17177/AXTI1Gr.mp4
- http://i.imgur.asdf.lalala.com/6162727/2727727/17177/AXTI1Gr.mp4
- http://i.imgur.com/AXTI1Gr.mp4
Не откроется для следующего:
- http://arstechnica.co.uk/gadgets/2015/10/android-6-0s-auto-backup-for-apps-perfect-data-backup-for-the-1-5
- http://i.imgur.asdf.lalala.com/6162727/2727727/17177/AXTI1Gr.mp3
- http://i.imgur.com/FqMAE9H.gifv
Я думаю, что ключ здесь host="*"
, Я не сделал тщательного изучения этого. Но это работает для меня, надеюсь, это поможет кому-то там тоже.