#android #intentfilter #android-architecture-navigation #android-navigation-graph
Вопрос:
Я использую навигационный компонент и навигационный график для обработки глубоких ссылок. Я добавил глубокие ссылки на свои пункты назначения, как показано ниже
<deepLink app:uri="example://foo" />
В документации по фильтру намерений упоминаются:
Если фильтр указывает схему и полномочия, но не путь, все URI с одинаковой схемой и полномочиями проходят фильтр, независимо от их путей.
Согласно этому, uri example://foo
должен соответствовать моей глубокой связи. Но слияние манифеста добавляет эту строку в мой фильтр намерений, даже если в мой uri не добавляется никакой путь:
<data android:path="/" />
Таким example://foo/
образом, сопоставляется только а. Есть ли способ указать, чтобы слияние манифеста или график навигации удалили этот элемент данных из моего фильтра намерений?
Комментарии:
1. «все URI с одинаковой схемой и полномочиями проходят фильтр, независимо от их путей». означает , что ваш фильтр намерения без пути также соответствует
example://foo/anything
, а это не то, что, по вашимapp:uri
словам, он должен соответствовать
Ответ №1:
Android не позволяет вам создавать intent-filter
только тот, который не соответствует никакому пути вообще: невозможно написать фильтр намерений, который соответствует example://foo
, но не example://foo/something_random
соответствует .
В соответствии с этой проблемой это сделано намеренно: использование uri без пути, подобного app:uri="example://foo"
, означает, что вы хотите точно соответствовать этому пустому пути, т. Е. /
И не сопоставлять каждый отдельный путь с этими полномочиями и схемой.
Комментарии:
1.спасибо, Йен. Я понимаю, что ты имеешь в виду. Но поскольку мы используем только схему и хост, это не должно быть для нас проблемой. Это также относится к нам, когда мы не использовали навигационный компонент. Мы добавили
intent-filter
s в наш манифест «нравитсяexample://screenA
example://screenB
«, и это сработало для нас.
Ответ №2:
Я также столкнулся с этой раздражающей вещью.
Я не согласен с последним ответом, так как вы можете просто создать свой собственный intent-filter
, который объявляет только схему и хост.
Я считаю, что это ошибка в nav-graph
обработке тегов (та, которую вы вложили в activity
свой тег).
Простое удаление:
<nav-graph android:value="@navigation/your_nav_graph" />
И замените его фильтром намерений, который вы создаете вручную:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="foo"
android:scheme="example" />
</intent-filter>
Я знаю, что в основном говорю вам не использовать функцию автоматического intent-filter
создания навигации, но это единственный способ, которым я обнаружил, что навигационный компонент принимает
Комментарии:
1. Я действительно не хочу обрабатывать глубокие ссылки вручную. Это одна из причин, по которой мы используем навигационный компонент. Наше простое решение-добавить «/» в конце строки хоста.
2. Я могу это уважать :). В моем случае фактическая ссылка не могла быть изменена, поэтому у меня не было выбора. удачи.