<uri-relative-filter-group>

sintassi:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
contenuto in:
<intent-filter>
può contenere:
<data>
description:
Crea regole di corrispondenza precise Intent che possono includere parametri di query URI e frammenti URI. Le regole possono essere di inclusione (allow) o di esclusione (blocking) regole, a seconda dell'attributo android:allow. Le regole di corrispondenza sono specificate dagli attributipath*, fragment* e query* degli elementi <data> contenuti.

Corrispondenza

Per trovare una corrispondenza con un URI, ogni parte del gruppo di filtri relativi all'URI deve corrispondere a una parte dell'URI. Possono esistere parti dell'URI non specificate nel gruppo di filtri relativi all'URI. Ad esempio:

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

Il filtro corrisponde a https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 perché è presente tutto ciò che è specificato dal gruppo di filtri relativi all'URI. Il filtro corrisponde anche a https://project.example.com/any/path/here?param2=value2&param1=value1 perché l'ordine dei parametri di query non è importante. Tuttavia, il filtro non corrisponde a https://project.example.com/any/path/here?param1=value1, a cui manca param2=value2.

OR e AND

I tag <data> esterni a un <uri-relative-filter-group> sono collegati con OR, mentre i tag <data> all'interno di un <uri-relative-filter-group> sono collegati con AND.

Considera l'esempio seguente:

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

Il filtro corrisponde ai percorsi che iniziano con /prefix OR terminano con suffix.

Al contrario, l'esempio seguente corrisponde ai percorsi che iniziano con /prefix AND terminano con 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>

Di conseguenza, più path attributi nello stesso <uri-relative-filter-group> non corrispondono a nulla:

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

Ordine di dichiarazione

Considera l'esempio seguente:

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

Il filtro corrisponde al frammento #fragment perché viene trovata una corrispondenza prima che venga valutata la regola di esclusione, ma i frammenti come #fragment123 non corrispondono.

Tag fratelli

<uri-relative-filter-group> I tag <data> funzionano insieme ai tag <data> fratelli (ovvero i tag <data> che si trovano all'esterno di <uri-relative-filter-group>, ma all'interno dello stesso <intent-filter>). I tag <uri-relative-filter-group> devono avere tag <data> fratelli per funzionare correttamente, perché gli attributi URI sono reciprocamente dipendenti a livello di <intent-filter>:

  • Se non viene specificato un scheme per il filtro per intent, tutti gli altri attributi URI vengono ignorati.
  • Se non viene specificato un host per il filtro, l'attributo port e tutti gli attributi path* vengono ignorati.

I figli <data> di un <intent-filter> vengono valutati prima di qualsiasi <uri-relative-filter-group> tag. Poi i tag <uri-relative-filter-group> vengono valutati in ordine, ad esempio:

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

Il filtro accetta https://project.example.com/path?query perché corrisponde a <data android:path="/path" />, che si trova all'esterno della <uri-relative-filter-group> regola di esclusione.

Caso d'uso comune

Supponiamo di avere l'URI https://project.example.com/path, che vuoi far corrispondere a un Intent a seconda della presenza o del valore di un parametro di query. Per creare un filtro per intent che corrisponda a https://project.example.com/path e blocchi https://project.example.com/path?query, potresti provare a fare quanto segue:

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

In realtà, non funziona. L'https://project.example.com/path?query URI corrisponde al percorso /path e il <uri-relative-filter-group> tag consente parti aggiuntive durante la corrispondenza.

Modifica il filtro per intent come segue:

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

Questo filtro funziona perché le regole di blocco che vietano i parametri di query non vuoti vengono valutate per prime.

Per semplificare il codice, inverti il comportamento in modo da consentire i parametri di query e bloccare gli URI senza parametri di query:

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

Caratteri codificati in URI

Per trovare una corrispondenza con gli URI che contengono caratteri codificati in URI, scrivi i caratteri non codificati non elaborati nel filtro, ad esempio:

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

Il filtro corrisponde a ?param=value! e ?param=value%21.

Tuttavia, se scrivi i caratteri codificati nel filtro come segue:

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

Il filtro non corrisponde né a ?param=value! né a ?param=value%21.

Numero di elementi

Puoi inserire un numero qualsiasi di <uri-relative-filter-group> elementi all'interno di un <intent-filter>.

Altre risorse

Per informazioni sul funzionamento dei filtri per intent, incluse le regole per la corrispondenza degli oggetti intent con i filtri, consulta Intent e filtri per intent e Filtri per intent.

Per informazioni su <uri-relative-filter-group>, consulta UriRelativeFilterGroup e UriRelativeFilter.

attributi:
android:allow
Indica se questo gruppo di filtri relativi all'URI è una regola di inclusione (allow) anziché una regola di esclusione (blocking). Il valore predefinito è "true".
Valore Descrizione
"true" (valore predefinito) Se il gruppo di filtri relativi all'URI corrisponde, il filtro per intent corrisponde
"false" Se il gruppo di filtri relativi all'URI corrisponde, il filtro per intent non corrisponde
introdotta in:
Livello API 35
vedi anche:
<intent-filter>
<data>