Соответствие шаблону URL в ‹intent-filter›

Я хочу, чтобы одно из моих действий использовало определенный URL-адрес. Шаблон:

http://www.example.com/abc123/foo/xyz789

Компоненты пути «abc123» и «xyz789» могут быть любой последовательностью буквенно-цифровых символов длиной > 1.

Выполнение этого в моем манифесте:

<activity>
  <intent-filter>
    <action
      android:name="android.intent.action.VIEW" />
    <category
      android:name="android.intent.category.DEFAULT" />
    <category
      android:name="android.intent.category.BROWSABLE" />

    <data
      android:scheme="http"
      android:host="example.com" 
      android:pathPattern="/.*/foo/.*" />

но кажется, что любой шаблон из моего домена сопоставляется, то есть:

myexample.com
myexample.com/whatever

оба совпадут. Я думаю, может быть, оператор .* работает не так, как я ожидаю? Любая помощь была бы здоровой,

Спасибо

http://developer.android.com/guide/topics/manifest/data-element.html


person user291701    schedule 21.01.2011    source источник


Ответы (3)


У меня была такая же проблема сегодня, мое решение было:

   <data android:pathPattern="/remotes/..*/..*"/>

используя (..*) вместо (.+)

В случае исходного вопроса я предполагаю, что это может сработать:

<data
                android:host="example.com"
                android:pathPattern="..*/foo/..*"
                android:scheme="http"/>
person CronosNull    schedule 03.06.2013
comment
Это супер ценно. ..* соответствует 1 или более вхождениям любого символа. - person xeed; 07.11.2014
comment
Большое спасибо! Это именно то, что я искал! :) - person Rodrigo Borges; 27.02.2015

Поскольку ОС Android использует PatternMatcher и наблюдает из исходный код и документация, он может работать только с . * и \\ (символами перехода ) нам, возможно, придется проявить некоторую изобретательность, т. е. использовать \\, чтобы остановить вычисление регулярных выражений, а затем продолжить с этого момента.

<data
                android:host="example.com"
                android:pathPattern=".*\\/foo/.*"
                android:scheme="http"/>

который будет соответствовать только myexample.com/whatever, а не myexample.com

Чтобы создать разные фильтры намерений с различным uri, используйте / в конце uri, например

Пример решения: используйте http://www.example.com/abc123/foo/xyz789/ вместо http://www.example.com/abc123/foo/xyz789 а потом использовать

example.com/abc123/ android:pathPattern=".*\\/

example.com/abc123/foo/xyz789/ android:pathPattern=".*\\/foo/.*\\/

example.com/abc123/foo/xyz789/bar/uvx456/ android:pathPattern=".*\\/foo/.*\\/bar/.*\\/

person Community    schedule 08.01.2013

Проблема в том, что .* соответствует всему, -и ничему-, поэтому /.*/ соответствует //, что эквивалентно только / в пути.

Кроме того, вы можете убедиться, что два сегмента пути abc123 в вашем примере совпадают с поддерживаемым здесь средством сопоставления выражений.

Другими словами, вы хотите изменить свои пути на что-то более простое, что можно сопоставить. если это ваш компонент, который получает намерение, вы можете передать поддельный URL-адрес, который представляет собой только переменные части реального URL-адреса. например, если вы хотите сопоставить,

http://www.example.com/.+/foo/.+

Если две захваченные группы равны, просто передайте http://mystuff/abc123 в намерении и установите шаблон данных на http://mystuff/*.

Затем проанализируйте это, когда вы получите намерение, и преобразуйте его в реальный URL-адрес, заполнив известные постоянные части.

person Jeffrey Blattman    schedule 21.01.2011
comment
Привет, спасибо за информацию, две группы будут разными (обновлен Q, чтобы отразить). Можем ли мы использовать оператор .+? Кажется, это все еще соответствует всему: pattern=/.+/foo/.+ - person user291701; 22.01.2011