2012-06-17 5 views
20

J'ai passé en revue toutes les questions semblables ici, mais je ne peux pas pour la vie de moi comprendre ce que je fais mal.Lancer une intention pour le type de fichier et MIME?

J'ai écrit une application qui essaie de lancer divers fichiers, sorte de navigateur de fichiers. Lors d'un clic sur un fichier, il tente de lancer le programme en fonction du type MIME associé ou présente le dialogue "Choisir une application à lancer".

Voici le code que je utilise pour lancer:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

Cela échoue et génère l'erreur:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

Maintenant, si j'installe OI Gestionnaire de fichiers, par exemple, il ouvre au lieu de cette Une erreur est levée, et si je clique sur le même fichier de l'intérieur, elle lance les boîtes de dialogue appropriées.

J'ai remarqué que le type MIME pour ce fichier particulier échoue, mais d'autres types mime comme .zip renvoient des valeurs. Ai-je quelque chose qui manque quand le type MIME est nul pour appeler une boîte de dialogue qui permet à l'utilisateur de sélectionner?

J'ai essayé d'autres variantes de lancement de l'application, y compris ne pas définir le type MIME et uniquement en utilisant .setData sans succès. L'action que je veux arriver est, un utilisateur clique sur un fichier, si elle est associée à une application que l'application lance, sinon, l'utilisateur obtient la boîte de dialogue «Action complète en utilisant» avec une liste d'applications.

Merci pour tout conseil.

+0

que se passe-t-il dans mimetype string ?? le coller ici –

+0

On dirait que c'est quelque chose qui a un fichier associé c'est le bon type MIME, mais si c'est quelque chose qui n'a pas été lié à une application, ça passe par null .. – stonedonkey

Répondre

44

Eh bien merci aux gars ouverts Intent, j'ai raté la réponse la première fois par leur code dans leur gestionnaire de fichiers, voici ce que j'ai fini avec:

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

Si vous utilisez un type de mime "*/*" quand vous ne pouvez pas le déterminer à partir du système (c'est null) il déclenche la boîte de dialogue de sélection d'application appropriée.

+7

AVERTISSEMENT! - Pour les jpgs, le type mime est jpeg et pas jpg. En utilisant votre code, si vous extrayez l'extension jpg, le type mime ne sera pas défini correctement et par conséquent, vous ne pourrez pas voir l'image. Assurez-vous de remplacer jpg avec jpeg lors de la définition du type mime pour les images jpg. – AndroidDev

+0

remercie son aide moi, mais le fichier réel ne pas sélecteur après la définition de intent.setDataAndType (data, type); le téléchargement du fichier a échoué. –

+1

De plus, The MimeTypeMap.getFileExtensionFromUrl ne peut pas gérer correctement les apostrophes: il retournera une chaîne vide pour "World'sHello.docx", mais retournera docx pour "WorldzHello.docx". Voir Regex ici: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

Vous pouvez utiliser des intentions génériques pour ouvrir des fichiers, comme ce fragment de code qui est proposé here:

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

Mais je vois souvent qui vérifie les applications extension du fichier dans imbriqué si et enfin essayer d'ouvrir le fichier avec " text/plain Type ":

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

Vous pouvez voir code complet this question ou dans ce open source project. J'espère que cela t'aidera.

+0

J'ai essayé les deux et aucun résultat dans le résultat que je cherche. Le premier exemple génère la même exception. La seconde essaie de lancer uniquement les applications qui comprennent le texte/plaine comme un type MIME, ce qui ne fonctionnera pas non plus. Merci bien. – stonedonkey