- Syntaxe :
-
<uri-relative-filter-group android:allow=["true" | "false"]> <data ... /> ... </uri-relative-filter-group>
- Contenu dans :
-
<intent-filter> - Peut contenir :
-
<data> - Description :
-
Crée des règles de correspondance
Intentprécises pouvant inclure des paramètres de requête et des fragments d'URI. Les règles peuvent être des règles d'inclusion (autoriser) ou d'exclusion (bloquer), selon l'attributandroid:allow. Les règles de correspondance sont spécifiées par les attributspath*,fragment*etquery*des éléments<data>contenus.Mise en correspondance
Pour qu'un URI corresponde, chaque partie du groupe de filtres relatifs à l'URI doit correspondre à une partie de l'URI. Certaines parties de l'URI peuvent ne pas être spécifiées dans le groupe de filtres relatifs à l'URI. Exemple :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="true"> <data android:query="param1=value1" /> <data android:query="param2=value2" /> </uri-relative-filter-group> ... </intent-filter>
Le filtre correspond à
https://project.example.com/any/path/here?param1=value1¶m2=value2¶m3=value3, car tout ce qui est spécifié par le groupe de filtres relatifs à l'URI est présent. Le filtre correspond également àhttps://project.example.com/any/path/here?param2=value2¶m1=value1, car l'ordre des paramètres de requête n'a pas d'importance. Toutefois, le filtre ne correspond pas àhttps://project.example.com/any/path/here?param1=value1, qui ne contient pasparam2=value2.OR et AND
Les balises
<data>en dehors d'un<uri-relative-filter-group>sont combinées par un opérateur OR, tandis que les balises<data>à l'intérieur d'un<uri-relative-filter-group>sont combinées par un opérateur AND.Prenons l'exemple suivant :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <data android:pathPrefix="/prefix" /> <data android:pathSuffix="suffix" /> ... </intent-filter>
Le filtre correspond aux chemins commençant par
/prefixOU se terminant parsuffix.En revanche, l'exemple suivant correspond aux chemins commençant par
/prefixET se terminant parsuffix:<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group> <data android:pathPrefix="/prefix" /> <data android:pathSuffix="suffix" /> </uri-relative-filter-group> ... </intent-filter>
Par conséquent, plusieurs attributs
pathdans le même<uri-relative-filter-group>ne correspondent à rien :<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group> <data android:path="/path1" /> <data android:path="/path2" /> </uri-relative-filter-group> ... </intent-filter>
Ordre des déclarations
Prenons l'exemple suivant :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group> <data android:fragment="fragment" /> </uri-relative-filter-group> <uri-relative-filter-group android:allow="false"> <data android:fragmentPrefix="fragment" /> </uri-relative-filter-group> ... </intent-filter>
Le filtre correspond au fragment
#fragment, car une correspondance est trouvée avant l'évaluation de la règle d'exclusion, mais les fragments tels que#fragment123ne correspondent pas.Tags frères
Les balises
<uri-relative-filter-group>fonctionnent avec leurs balises<data>associées (c'est-à-dire les balises<data>qui se trouvent en dehors de<uri-relative-filter-group>, mais à l'intérieur de la même balise<intent-filter>). Les balises<uri-relative-filter-group>doivent avoir des balises<data>associées pour fonctionner correctement, car les attributs URI sont mutuellement dépendants au niveau<intent-filter>:- Si aucun
schemen'est spécifié pour le filtre d'intent, tous les autres attributs d'URI sont ignorés. - Si aucun élément
hostn'est spécifié pour le filtre, l'attributportet tous les attributspath*sont ignorés.
Les enfants
<data>d'un<intent-filter>sont évalués avant les balises<uri-relative-filter-group>. Les balises<uri-relative-filter-group>sont ensuite évaluées dans l'ordre, par exemple :<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="false"> <data android:path="/path" /> <data android:query="query" /> </uri-relative-filter-group> <data android:path="/path" /> ... </intent-filter>
Le filtre accepte
https://project.example.com/path?query, car il correspond à<data android:path="/path" />, qui est en dehors de la règle d'exclusion<uri-relative-filter-group>.Cas d'utilisation courant
Imaginons que vous ayez l'URI
https://project.example.com/path, que vous souhaitez faire correspondre à unIntenten fonction de la présence ou de la valeur d'un paramètre de requête. Pour créer un filtre d'intent qui correspond àhttps://project.example.com/pathet bloquehttps://project.example.com/path?query, vous pouvez essayer quelque chose comme :<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="true"> <data android:path="/path" /> </uri-relative-filter-group> ... </intent-filter>
En fait, cela ne fonctionne pas. L'URI
https://project.example.com/path?querycorrespond au chemin d'accès/path, et la balise<uri-relative-filter-group>autorise les parties supplémentaires lors de la mise en correspondance.Modifiez le filtre d'intent comme suit :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="false"> <data android:path="/path" /> <data android:queryAdvancedPattern=".+" /> </uri-relative-filter-group> <uri-relative-filter-group android:allow="true"> <data android:path="/path" /> </uri-relative-filter-group> ... </intent-filter>
Ce filtre fonctionne, car les règles de blocage qui interdisent les paramètres de requête non vides sont évaluées en premier.
Pour simplifier le code, inversez le comportement afin d'autoriser les paramètres de requête et de bloquer les URI sans paramètres de requête :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="true"> <data android:path="/path" /> <data android:queryAdvancedPattern=".+" /> </uri-relative-filter-group> ... </intent-filter>
Caractères encodés en URI
Pour faire correspondre les URI contenant des caractères encodés en URI, saisissez les caractères bruts non encodés dans le filtre, par exemple :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="true"> <data android:query="param=value!" /> </uri-relative-filter-group> ... </intent-filter>
Le filtre correspond à
?param=value!et?param=value%21.Toutefois, si vous écrivez des caractères encodés dans le filtre comme suit :
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <uri-relative-filter-group android:allow="true"> <data android:query="param=value%21" /> </uri-relative-filter-group> ... </intent-filter>
Le filtre ne correspond ni à
?param=value!ni à?param=value%21.Nombre d'éléments
Vous pouvez placer autant d'éléments
<uri-relative-filter-group>que vous le souhaitez dans un élément<intent-filter>.Autres ressources
Pour en savoir plus sur le fonctionnement des filtres d'intent, y compris les règles de mise en correspondance des objets d'intent, consultez Intents et filtres d'intent et Filtres d'intent.
Pour en savoir plus sur
<uri-relative-filter-group>, consultezUriRelativeFilterGroupetUriRelativeFilter. - Si aucun
- Attributs :
-
android:allow-
Indique si ce groupe de filtres relatifs à l'URI est une règle d'inclusion (allow) plutôt qu'une règle d'exclusion (blocking). La valeur par défaut est
"true".Valeur Description "true"(par défaut)Si le groupe de filtres relatifs à l'URI correspond, le filtre d'intent correspond. "false"Si le groupe de filtres relatifs à l'URI correspond, le filtre d'intent ne correspond pas.
- Première apparition :
- Niveau d'API 35
- Voir aussi :
-
<intent-filter><data>
<uri-relative-filter-group>
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2026/04/21 (UTC).
[null,null,["Dernière mise à jour le 2026/04/21 (UTC)."],[],[]]