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="*". Я не сделал подробного изучения этого. Но это работает для меня, надеюсь, что это поможет кому-то и там.