- 構文:
-
<uri-relative-filter-group android:allow=["true" | "false"]> <data ... /> ... </uri-relative-filter-group>
- 上位の要素:
-
<intent-filter> - 含めることのできる要素:
-
<data> - 説明:
-
URI クエリ パラメータと URI フラグメントを含めることができる正確な
Intent照合ルールを作成します。ルールは、android:allow属性に応じて、包含(許可)ルールまたは除外(ブロック)ルールにできます。一致ルールは、含まれている<data>要素のpath*、fragment*、query*属性で指定されます。マッチング問題
URI を照合するには、URI 関連フィルタ グループの各部分が URI の一部と一致する必要があります。URI 相対フィルタ グループで指定されていない URI の部分が存在する可能性があります。以下に例を示します。
<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>
URI 相対フィルタ グループで指定されたものがすべて存在するため、フィルタは
https://project.example.com/any/path/here?param1=value1¶m2=value2¶m3=value3と一致します。クエリ パラメータの順序は関係ないため、このフィルタはhttps://project.example.com/any/path/here?param2=value2¶m1=value1にも一致します。ただし、フィルタはhttps://project.example.com/any/path/here?param1=value1と一致しません。https://project.example.com/any/path/here?param1=value1にはparam2=value2がありません。OR と AND
<uri-relative-filter-group>の外側の<data>タグは OR 演算され、<uri-relative-filter-group>の内側の<data>タグは AND 演算されます。次の例を考えてみましょう。
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <data android:pathPrefix="/prefix" /> <data android:pathSuffix="suffix" /> ... </intent-filter>
このフィルタは、
/prefixで始まるパス、またはsuffixで終わるパスと一致します。一方、次の例では、
/prefixで始まりsuffixで終わるパスが一致します。<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>
その結果、同じ
<uri-relative-filter-group>内の複数のpath属性は何も一致しません。<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>
宣言の順序
次の例を考えてみましょう。
<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>
除外ルールが評価される前に一致が見つかるため、フィルタはフラグメント
#fragmentと一致しますが、#fragment123などのフラグメントは一致しません。兄弟タグ
<uri-relative-filter-group>タグは、兄弟の<data>タグ(つまり、<uri-relative-filter-group>の外側で同じ<intent-filter>の内側にある<data>タグ)と連携して動作します。 URI 属性は<intent-filter>レベルで相互に依存しているため、<uri-relative-filter-group>タグが正しく機能するには、兄弟の<data>タグが必要です。- インテント フィルタに対して
schemeが指定されていない場合、他のすべての URI 属性が無視されます。 - フィルタに対して
hostが指定されていない場合、port属性とすべてのpath*属性が無視されます。
<intent-filter>の<data>子は、<uri-relative-filter-group>タグよりも先に評価されます。次に、<uri-relative-filter-group>タグが順番に評価されます。例:<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>
https://project.example.com/path?queryは<data android:path="/path" />と一致し、<uri-relative-filter-group>除外ルールの範囲外であるため、フィルタはhttps://project.example.com/path?queryを受け入れます。一般的なユースケース
URI
https://project.example.com/pathがあり、クエリ パラメータの有無や値に応じてIntentと照合するとします。https://project.example.com/pathに一致し、https://project.example.com/path?queryをブロックするインテント フィルタを作成するには、次のようにします。<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>
実際には、これは機能しません。
https://project.example.com/path?queryURI はパス/pathと一致し、<uri-relative-filter-group>タグは照合時に追加部分を許可します。インテント フィルタを次のように修正します。
<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>
このフィルタが機能するのは、空でないクエリ パラメータを禁止するブロックルールが最初に評価されるためです。
コードをシンプルにするため、動作を反転して、クエリ パラメータのないクエリ パラメータとブロック URI を許可します。
<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>
URI エンコードされた文字
URI エンコードされた文字を含む URI を照合するには、フィルタにエンコードされていない生の文字を記述します。次に例を示します。
<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>
このフィルタは
?param=value!と?param=value%21に一致します。ただし、次のようにフィルタにエンコードされた文字を記述した場合:
<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>
フィルタは
?param=value!と?param=value%21のどちらとも一致しません。要素の数
<intent-filter>内に任意の数の<uri-relative-filter-group>要素を配置できます。参考情報
インテント オブジェクトとフィルタのマッチング ルールなど、インテント フィルタの仕組みの詳細については、インテントとインテント フィルタ、およびインテント フィルタをご覧ください。
<uri-relative-filter-group>の詳細については、UriRelativeFilterGroupとUriRelativeFilterをご覧ください。 - インテント フィルタに対して
- 属性:
- 導入時の API レベル:
- API レベル 35
- 関連項目:
-
<intent-filter><data>
<uri-relative-filter-group>
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2026-04-21 UTC。
[null,null,["最終更新日 2026-04-21 UTC。"],[],[]]