pathPattern для сопоставления с расширением файла не работает, если в другом месте имени файла существует точка?

Я вижу многочисленные примеры использования pathPattern для определения фильтра намерений для определенного расширения / типа файла; например, pathPattern=".*\\.xyz",

К сожалению, это, кажется, не работает должным образом, если у рассматриваемого файла есть точка в другом месте в пути; например "my.filename.xyz".

Существует ли синтаксис pathPattern, который будет соответствовать как "myfilename.xyz", так и "my.filename.xyz"?

3 ответа

Решение

Команда 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". Лучшее, что вы можете сделать, это следовать решению Джейсона, чтобы добавить дополнительные шаблоны, чтобы сопоставить пути с таким количеством точек, сколько вы хотите указать шаблоны.

Столкнулся с той же проблемой, пытаясь открыть файл в папке с точками. Я обнаружил, что могу просто добавить несколько элементов "данных", в зависимости от того, сколько точек я ожидал иметь в моих путях:

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

Другие вопросы по тегам