2016-09-02 1 views
2

Mon application peut ouvrir les formats de fichiers suivants:filtre intention Android ne fonctionne pas

  • kml (application/vnd.google-earth.kml + xml)
  • KMZ (application/vnd.google-terre. KMZ)
  • GPX (application/GPX + xml)

Je suis en train de mettre en place correctement mes filtres d'intention pour que mon application est proposée en essayant d'ouvrir un de ces types de fichiers, à travers les schémas suivants :

  • http
  • https
  • fichier
  • contenu

j'attendre le filtre suivant pour attraper tous les cas (sauf les fichiers avec des points dans le nom, mais c'est un autre problème):

<intent-filter> 

    <action android:name="android.intent.action.VIEW" /> 

    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 

    <data android:scheme="file" /> 
    <data android:scheme="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:pathPattern=".*\\.kml" /> 
    <data android:pathPattern=".*\\.kmz" /> 
    <data android:pathPattern=".*\\.gpx" /> 

    <data android:mimeType="application/vnd.google-earth.kml+xml" /> 
    <data android:mimeType="application/vnd.google-earth.kmz" /> 
    <data android:mimeType="application/gpx+xml" /> 

</intent-filter> 

Mais si l'explorateur de fichiers ne définit pas correctement le type de contenu GPX, GPX les fichiers ne sont pas reconnus (même s'ils sont correctement nommés, avec l'extension ".gpx").

Est-ce que quelqu'un sait quel est le problème?

+0

je régler cela comme deux filtres. L'un est 'fichier' et les extensions. L'autre est les autres schémas et les types MIME. Dans l'état actuel, par exemple, si le contenu a le bon type MIME, mais que le chemin ne possède pas l'une de ces extensions (comme c'est rarement le cas pour 'content'), votre filtre ne correspondra pas. En général, les extensions de fichiers sont l'approche la moins fiable sur Android. – CommonsWare

+0

Merci! J'ai presque là, j'ai quelque chose qui semble gérer tous les cas. Pourquoi voudriez-vous restreindre le régime sur les 2 filtres? Pourquoi pas un filtre pour les extensions et un pour les types mime, tous les deux pour tous les schémas? –

+0

Eh bien, pour 'http' et' https', le type MIME serait plus fiable à mon humble avis. Pour 'content', il n'y a souvent pas d'extension de fichier. J'ai tendance à utiliser une plus petite portée qui est moins susceptible de me donner des résultats erronés. Mais, si vous voulez appliquer les quatre schémas dans les deux filtres, cela fonctionne probablement. – CommonsWare

Répondre

3

Voici donc ce que j'ai fini avec:

<!--Mime type set --> 
<intent-filter> 

    <action android:name="android.intent.action.VIEW" /> 

    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 

    <data android:scheme="file" /> 
    <data android:scheme="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <!-- Valid mime types --> 
    <data android:mimeType="application/vnd.google-earth.kml+xml" /> 
    <data android:mimeType="application/vnd.google-earth.kmz" /> 
    <data android:mimeType="application/gpx+xml" /> 

    <!-- Invalid mime types used by some bad software --> 
    <data android:mimeType="application/kml" /> 
    <data android:mimeType="application/kmz" /> 
    <data android:mimeType="application/gpx" /> 

    <data android:mimeType="application/kml+xml" /> 
    <data android:mimeType="application/kmz+xml" /> 

    <data android:mimeType="application/vnd.google-earth.kml" /> 
    <data android:mimeType="application/vnd.google-earth.gpx" /> 
    <data android:mimeType="application/vnd.google-earth.kmz+xml" /> 
    <data android:mimeType="application/vnd.google-earth.gpx+xml" /> 

    <data android:mimeType="text/kml" /> 
    <data android:mimeType="text/kmz" /> 
    <data android:mimeType="text/gpx" /> 

    <data android:mimeType="text/kml+xml" /> 
    <data android:mimeType="text/kmz+xml" /> 
    <data android:mimeType="text/gpx+xml" /> 

    <data android:mimeType="text/xml+kml" /> 
    <data android:mimeType="text/xml+kmz" /> 
    <data android:mimeType="text/xml+gpx" /> 

</intent-filter> 

<!-- Mime type not set but valid extensions --> 
<intent-filter> 

    <action android:name="android.intent.action.VIEW" /> 

    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 

    <data android:scheme="file" /> 
    <data android:scheme="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:host="*" /> 

    <data android:pathPattern="/.*..*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*\\.kml" /> 
    <data android:pathPattern="/.*..*\\.kmz" /> 
    <data android:pathPattern="/.*\\.gpx" /> 
    <data android:pathPattern="/.*\\.kml" /> 
    <data android:pathPattern="/.*\\.kmz" /> 

</intent-filter> 

<!-- Invalid mime type but valid extensions --> 
<intent-filter> 

    <action android:name="android.intent.action.VIEW" /> 

    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 

    <data android:scheme="file" /> 
    <data android:scheme="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:host="*" /> 
    <data android:mimeType="*/*" /> 

    <data android:pathPattern="/.*..*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*\\.kml" /> 
    <data android:pathPattern="/.*..*\\.kmz" /> 
    <data android:pathPattern="/.*\\.gpx" /> 
    <data android:pathPattern="/.*\\.kml" /> 
    <data android:pathPattern="/.*\\.kmz" /> 

</intent-filter> 

semble fonctionner sur tout le gestionnaire de fichiers je l'ai testé (FX, ES, Astro, File Commander).

(Pour ceux qui se demandent sur les modèles de chemin étranges voir pathPattern to match file extension does not work if a period exists elsewhere in the file name?)

+0

Est-ce que cela fonctionne pour ouvrir les pièces jointes Gmail? –

+0

IIRC oui c'est le cas! –