Есть ли способ указать слиянию манифестов, чтобы не добавлять данные пути в фильтр намерений

#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. Я могу это уважать :). В моем случае фактическая ссылка не могла быть изменена, поэтому у меня не было выбора. удачи.