Il y a beaucoup de désinformation sur ce sujet, notamment de la propre documentation de Google. Le meilleur, et étant donné la logique étrange, la seule vraie documentation est peut-être le code source.
L' implémentation du filtre d'intention a une logique qui défie presque toute description. Le code de l'analyseur est l'autre pièce pertinente du puzzle.
Les filtres suivants sont assez proches du comportement raisonnable. Les modèles de chemin s'appliquent, pour les intentions de schéma de «fichier».
La correspondance de modèle de type mime global correspondra à tous les types tant que l'extension de fichier correspond. Ce n'est pas parfait, mais c'est le seul moyen de faire correspondre le comportement des gestionnaires de fichiers comme ES File Explorer, et il est limité aux intentions où l'URI / l'extension de fichier correspond.
Je n'ai pas inclus d'autres schémas comme "http" ici, mais ils fonctionneront probablement très bien sur tous ces filtres.
Le schéma étrange est "contenu", pour lequel l'extension n'est pas disponible pour le filtre. Mais tant que le fournisseur indique votre type MIME (par exemple, Gmail transmettra le type MIME pour la pièce jointe sans entrave), le filtre correspondra.
Il faut être conscient de:
- Sachez que rien ne se comporte de manière cohérente dans les filtres, c'est un labyrinthe de cas particuliers et traite la violation du principe de moindre surprise comme un objectif de conception. Aucun des algorithmes de correspondance de modèles ne suit la même syntaxe ou le même comportement. L'absence d'un champ est parfois un joker et parfois non. Les attributs d'un élément de données doivent parfois aller ensemble et parfois ignorer le regroupement. Cela aurait vraiment pu être mieux fait.
- Le schéma ET l'hôte doivent être spécifiés pour que les règles de chemin correspondent (contrairement au guide API de Google, actuellement).
- Au moins ES File Explorer génère des intentions avec un type MIME de "", qui est filtré très différemment à null, il est impossible de faire correspondre explicitement et ne peut être mis en correspondance que par le filtre risqué "* / *".
- Le filtre «* / *» ne correspondra PAS aux intentions avec un type MIME nul - qui nécessite un filtre séparé pour ce cas spécifique sans aucun type MIME.
- Le schéma "contenu" ne peut être mis en correspondance que par type MIME, car le nom de fichier d'origine n'est pas disponible dans l'intention (au moins avec Gmail).
- Le regroupement des attributs dans des éléments de "données" séparés est (presque) sans rapport avec l'interprétation, à l'exception spécifique de l'hôte et du port - qui se couplent. Tout le reste n'a pas d'association spécifique dans un élément "data" ou entre des éléments "data".
Avec tout cela à l'esprit, voici un exemple avec des commentaires:
<!--
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>