Префикс пути фильтра намерений с '#' не работает

Я пытаюсь установить фильтр намерений для запуска моей активности, когда пользователь нажимает на следующий URI: example.com/pathA/pathB/#pathC/someGUID

поэтому я добавил следующий XML в файл манифеста:

<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:host="example.com"
        android:pathPrefix="/pathA/pathB/#pathC"
        android:scheme="http" />
</intent-filter>

Я думаю, что символ «#» все портит, но я безуспешно пытался избежать этого символа. Есть идеи?

ОБНОВЛЕНИЕ: когда я сказал «попытался экранировать», я имел в виду использование процентного кодирования (# равно% 23)


person Community    schedule 08.05.2013    source источник


Ответы (1)


Фильтры намерений используют UriMatcher для анализа URI и определения совпадения. # — это подстановочный знак URI для числа, как показано в примерах в UriMatcher. Согласно исходному коду UriMatcher нет escape-последовательности для выхода из # в URI. Поэтому вам следует использовать другой незарезервированный символ (обратите внимание, что * также зарезервирован в качестве подстановочного знака для любого текста).

person ianhanniballake    schedule 08.05.2013
comment
@user1774914 user1774914 - правильно - похоже, просто нет способа обрабатывать URI с # в нем. Конечно, вы могли бы обработать /pathA/pathB/ и вручную проверить оставшуюся часть URI на наличие #pathC, но системе будет казаться, что вы также обрабатываете URI, например /pathA/pathB/pathD. - person ianhanniballake; 09.05.2013
comment
Странно то, что в документах Android говорится... Поскольку '\' используется в качестве escape-символа, когда строка читается из XML (до того, как она будет проанализирована как шаблон), вам нужно будет дважды экранировать: например, литерал '*' будет записан как \*, а литерал '\' будет записан как \\\\. Это в основном то же самое, что вам нужно было бы написать при построении строки в коде Java. - person a54studio; 08.01.2016
comment
Это заставит вас поверить, что вы можете избежать его как \\# , но это все еще не работает. Я думаю, это просто не идет. - person a54studio; 08.01.2016
comment
2 года спустя Вы нашли способ понять это? Должны ли мы действительно взломать это, проверив URL-адрес в коде приложения, и если он не соответствует желаемому шаблону, мы просто откроем браузер? - person Achraf Amil; 11.06.2018
comment
Анализ фильтра намерений не изменился. - person ianhanniballake; 11.06.2018
comment
Пытаюсь сделать то же самое здесь. Неудачно :( - person Nicolas Castellanos; 01.10.2020