2010-12-07 36 views
4

Je suis en train d'ouvrir un File avec un Intent, mais Android n'ouvre pas la bonne application pour le type de fichier.droit mimeType pour l'ouverture du fichier

En utilisant le code suivant, chaque fichier - pdf, images, tout - est ouvert avec l'application de la musique:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.fromFile(file)); 
startActivity(i); 

Lorsque je précise manuellement le mimeType, la bonne application est ouverte - dans ce cas, le pictureviewer .

i.setDataAndType(Uri.fromFile(file), "image/*"); 

Est-il possible d'obtenir Android pour ouvrir l'application à droite, au lieu de définir manuellement le type juger par l'extension du fichier?

Répondre

1

Cela dépend des autres applications. S'ils ont défini leurs filtres d'intention, y compris les informations mime, les informations d'extension de fichier ou les deux. Donc, ma recommandation est que vous ne pouvez pas compter sur d'autres applications, donc la meilleure option est de fournir autant d'informations que possible lorsque vous lancez une intention, y compris le type MIME.

+1

Mais pourquoi pas Android figure le type correct sur son propre? Les états de référence d'intention pour le type "Spécifie un type explicite (un type MIME) des données d'intention Normalement, le type est déduit des données elles-mêmes En définissant cet attribut, vous désactivez cette évaluation et forcez un type explicite." Cela ne fonctionne pas du tout avec mon code, donc ça doit être une erreur dedans? – Gubbel

1

Vous pouvez faire quelque chose comme ceci:

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.fromFile(file)); 
intent.setType(FileHelper.getMimeType(file)); 
startActivity(intent); 

Voici (la partie pertinente) ma classe d'aide pour obtenir mimeType de fichier.

La clé est d'utiliser MimeTypeMap

public class FileHelper 
{ 

    public static String getMimeType(File file) 
    { 
     return getMimeType(file.getName()); 
    } 

    public static String getMimeType(String fileName) 
    { 
     String extension = getExtension(fileName); 
     if (extension == null) 
      return null; 
     return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    } 

    public static String getExtension(File file) 
    { 
     return getExtension(file.getName()); 
    } 

    public static String getExtension(String fileName) 
    { 
     int extensionDelimiter = fileName.lastIndexOf("."); 
     if (extensionDelimiter == -1) 
      return null; 
     return fileName.substring(extensionDelimiter + 1, fileName.length()); 
    } 
} 

Hope this helps.

+0

Fonctionne parfaitement. Merci. Je me demande pourquoi les modérateurs SO n'ont pas le privilège de marquer une réponse comme une réponse? MSDN Q/A site a cette fonctionnalité intéressante. – Sufian

+0

Je viens de remarquer que cela ne marche parfois pas, comme avec les images png. Du bon côté, j'ai trouvé la 2ème méthode dans le lien suivant qui fonctionne bien avec tous les types de fichiers que j'ai essayés. http://helloworldcodes.blogspot.com/2011/10/android-open-folder-with-default.html – Sufian

+0

ne fonctionne pas avec .png, vraiment? De mon côté ça marche. Merci pour le lien supplémentaire :-) – Pascal