<uri-relative-filter-group>

Syntax:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
enthalten in:
<intent-filter>
kann Folgendes enthalten:
<data>
description:
Erstellt präzise Intent-Abgleichsregeln, die URI-Suchparameter und URI-Fragmente enthalten können. Die Regeln können je nach android:allow-Attribut Einschlussregeln (allow) oder Ausschlussregeln (blocking) sein. Die Abgleichsregeln werden durch die Attribute path*, fragment* und query* der enthaltenen <data>-Elemente angegeben.

Abgleich

Damit ein URI übereinstimmt, muss jeder Teil der URI-Filtergruppe mit einem Teil des URI übereinstimmen. Es kann Teile des URI geben, die nicht in der Filtergruppe für relative URI angegeben sind. Beispiel:

<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>

Der Filter entspricht https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3, da alles, was durch die Filtergruppe für relative URIs angegeben wird, vorhanden ist. Der Filter stimmt auch mit https://project.example.com/any/path/here?param2=value2&param1=value1 überein, da die Reihenfolge der Abfrageparameter keine Rolle spielt. Der Filter stimmt jedoch nicht mit https://project.example.com/any/path/here?param1=value1 überein, da param2=value2 fehlt.

OR und AND

<data>-Tags außerhalb eines <uri-relative-filter-group> werden mit ODER verknüpft, während <data>-Tags innerhalb eines <uri-relative-filter-group> mit UND verknüpft werden.

Dazu ein Beispiel:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <data android:pathPrefix="/prefix" />
  <data android:pathSuffix="suffix" />
  ...
</intent-filter>

Der Filter entspricht Pfaden, die mit /prefix beginnen ODER mit suffix enden.

Im Gegensatz dazu stimmt das nächste Beispiel mit Pfaden überein, die mit /prefix beginnen UND mit suffix enden:

<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>

Daher stimmen mehrere path-Attribute in derselben <uri-relative-filter-group> mit nichts überein:

<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>

Reihenfolge der Erklärungen

Dazu ein Beispiel:

<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>

Der Filter stimmt mit dem Fragment #fragment überein, da eine Übereinstimmung gefunden wird, bevor die Ausschlussregel ausgewertet wird. Fragmente wie #fragment123 stimmen jedoch nicht überein.

Geschwister-Tags

<uri-relative-filter-group> -Tags funktionieren zusammen mit ihren gleichgeordneten <data>-Tags (d. h. <data>-Tags, die sich außerhalb des <uri-relative-filter-group>, aber innerhalb desselben <intent-filter> befinden). <uri-relative-filter-group>-Tags müssen gleichgeordnete <data>-Tags haben, damit sie richtig funktionieren, da URI-Attribute auf der <intent-filter>-Ebene voneinander abhängig sind:

  • Wenn für den Intent-Filter keine scheme angegeben ist, werden alle anderen URI-Attribute ignoriert.
  • Wenn für den Filter kein host angegeben ist, werden das Attribut port und alle path*-Attribute ignoriert.

Die <data>-Untergeordneten Elemente eines <intent-filter> werden vor allen <uri-relative-filter-group>-Tags ausgewertet. Anschließend werden die <uri-relative-filter-group>-Tags der Reihe nach ausgewertet, z. B.:

<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>

Der Filter akzeptiert https://project.example.com/path?query, da er mit <data android:path="/path" /> übereinstimmt, das außerhalb der Ausschlussregel <uri-relative-filter-group> liegt.

Häufiger Anwendungsfall

Angenommen, Sie haben den URI https://project.example.com/path, der je nach Vorhandensein oder Wert eines Abfrageparameters mit einem Intent abgeglichen werden soll. Wenn Sie einen Intent-Filter erstellen möchten, der https://project.example.com/path entspricht und https://project.example.com/path?query blockiert, können Sie Folgendes versuchen:

<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>

Das funktioniert tatsächlich nicht. Der https://project.example.com/path?query-URI entspricht dem Pfad /path und das Tag <uri-relative-filter-group> ermöglicht zusätzliche Teile beim Abgleich.

Ändern Sie den Intent-Filter so:

<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>

Dieser Filter funktioniert, weil die Blockierungsregeln, die nicht leere Abfrageparameter verbieten, zuerst ausgewertet werden.

Um den Code zu vereinfachen, können Sie das Verhalten umkehren, sodass Abfrageparameter zulässig sind und URIs ohne Abfrageparameter blockiert werden:

<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-codierte Zeichen

Wenn Sie URIs abgleichen möchten, die URI-codierte Zeichen enthalten, geben Sie die rohen, nicht codierten Zeichen in den Filter ein, z. B.:

<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>

Der Filter entspricht ?param=value! und ?param=value%21.

Wenn Sie jedoch codierte Zeichen im Filter so schreiben:

<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>

Der Filter stimmt weder mit ?param=value! noch mit ?param=value%21 überein.

Anzahl der Elemente

Sie können beliebig viele <uri-relative-filter-group>-Elemente in ein <intent-filter> einfügen.

Weitere Informationen

Informationen zur Funktionsweise von Intent-Filtern, einschließlich der Regeln für den Abgleich von Intent-Objekten mit Filtern, finden Sie unter Intents and Intent Filters und Intent Filters.

Informationen zu <uri-relative-filter-group> finden Sie unter UriRelativeFilterGroup und UriRelativeFilter.

Attribute:
android:allow
Gibt an, ob diese Gruppe relativer URI-Filter eine Einschlussregel (allow) und keine Ausschlussregel (blocking) ist. Der Standardwert ist "true".
Wert Beschreibung
"true" (Standard) Wenn die Filtergruppe für relative URIs übereinstimmt, stimmt der Intent-Filter überein.
"false" Wenn die Filtergruppe für relative URIs übereinstimmt, stimmt der Intent-Filter nicht überein.
Eingeführt in:
API-Level 35
Siehe auch:
<intent-filter>
<data>