C'è molta disinformazione su questo argomento, non da ultimo dalla documentazione di Google. La migliore, e data la strana logica, forse l'unica vera documentazione è il codice sorgente.
L' implementazione del filtro di intenti ha una logica che sfida quasi la descrizione. Il codice del parser è l'altro pezzo rilevante del puzzle.
I seguenti filtri si avvicinano molto al comportamento ragionevole. I modelli di percorso si applicano agli intenti dello schema "file".
La corrispondenza del modello di tipo MIME globale corrisponderà a tutti i tipi purché l'estensione del file corrisponda. Questo non è perfetto, ma è l'unico modo per abbinare il comportamento di gestori di file come ES File Explorer, ed è limitato agli intenti in cui l'URI / estensione del file corrisponde.
Non ho incluso altri schemi come "http" qui, ma probabilmente funzioneranno bene con tutti questi filtri.
Lo schema strano è "contenuto", per il quale l'estensione non è disponibile per il filtro. Ma fintanto che il provider dichiara il tuo tipo MIME (ad esempio Gmail trasmetterà il tipo MIME per l'allegato senza impedimenti), il filtro corrisponderà.
Trucchi di cui essere a conoscenza:
- Tieni presente che nulla si comporta in modo coerente nei filtri, è un labirinto di casi speciali e considera la violazione del principio della minima sorpresa come un obiettivo di progettazione. Nessuno degli algoritmi di pattern matching segue la stessa sintassi o comportamento. L'assenza di un campo a volte è un carattere jolly ea volte no. Gli attributi all'interno di un elemento di dati a volte devono andare insieme e talvolta ignorare il raggruppamento. Avrebbe potuto davvero essere fatto meglio.
- Lo schema E l'host devono essere specificati affinché le regole del percorso corrispondano (contrariamente alla guida API di Google, attualmente).
- Almeno ES File Explorer genera intenti con un tipo MIME di "", che è filtrato in modo molto diverso da null, è impossibile far corrispondere esplicitamente e può essere trovato solo dal filtro rischioso "* / *".
- Il filtro "* / *" NON corrisponderà a Intents con un tipo MIME nullo, che richiede un filtro separato per questo caso specifico senza alcun tipo MIME.
- Lo schema "contenuto" può essere trovato solo in base al tipo MIME, perché il nome del file originale non è disponibile nell'intento (almeno con Gmail).
- Il raggruppamento di attributi in elementi "dati" separati è (quasi) irrilevante per l'interpretazione, con l'eccezione specifica di host e porta, che si accoppiano insieme. Tutto il resto non ha alcuna associazione specifica all'interno di un elemento "data" o tra elementi "data".
Con tutto questo in mente, ecco un esempio con i commenti:
<!--
Capture content by MIME type, which is how Gmail broadcasts
attachment open requests. pathPattern and file extensions
are ignored, so the MIME type *MUST* be explicit, otherwise
we will match absolutely every file opened.
-->
<intent-filter
android:icon="@drawable/icon"
android:label="@string/app_name"
android:priority="50" >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:mimeType="application/vnd.my-type" />
</intent-filter>
<!--
Capture file open requests (pathPattern is honoured) where no
MIME type is provided in the Intent. An Intent with a null
MIME type will never be matched by a filter with a set MIME
type, so we need a second intent-filter if we wish to also
match files with this extension and a non-null MIME type
(even if it is non-null but zero length).
-->
<intent-filter
android:icon="@drawable/icon"
android:label="@string/app_name"
android:priority="50" >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:host="*" />
<!--
Work around Android's ugly primitive PatternMatcher
implementation that can't cope with finding a . early in
the path unless it's explicitly matched.
-->
<data android:pathPattern=".*\\.my-ext" />
<data android:pathPattern=".*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
</intent-filter>
<!--
Capture file open requests (pathPattern is honoured) where a
(possibly blank) MIME type is provided in the Intent. This
filter may only be necessary for supporting ES File Explorer,
which has the probably buggy behaviour of using an Intent
with a MIME type that is set but zero-length. It's
impossible to match such a type except by using a global
wildcard.
-->
<intent-filter
android:icon="@drawable/icon"
android:label="@string/app_name"
android:priority="50" >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:host="*" />
<data android:mimeType="*/*" />
<!--
Work around Android's ugly primitive PatternMatcher
implementation that can't cope with finding a . early in
the path unless it's explicitly matched.
-->
<data android:pathPattern=".*\\.my-ext" />
<data android:pathPattern=".*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
</intent-filter>