Lancer une intention pour le type de fichier et MIME?

j'ai passé en revue toutes les questions similaires ici, mais je ne peux pas pour la vie de moi comprendre ce que je fais mal.

j'ai écrit une application qui essaie de lancer différents fichiers, une sorte de navigateur de fichiers. Quand un fichier est cliqué, il essaie de lancer le programme basé sur son type MIME associé ou il présente la boîte de dialogue "Choisir L'Application à lancer".

voici le code que j'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);

This é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 File Manager par exemple, il s'ouvre au lieu que cette erreur soit lancée, et puis si je clique sur le même fichier de l'intérieur, il lance les dialogues approriate.

j'ai remarqué que le type MIME pour ce fichier particulier échoue, mais d'autres types mime comme .zip ne renvoient pas les valeurs.

est-ce que je manque quelque chose que lorsque le type MIME est nul pour appeler un dialogue qui permet à l'utilisateur de choisir?

j'ai essayé d'autres variantes de lancement de l'application, y compris ne pas définir le type MIME et seulement en utilisant .setData sans succès.

l'action que je veux arriver est, un utilisateur clique sur un fichier, si il est associé à une application que l'application lance, si non, l'utilisateur obtient la boîte de dialogue" action complète en utilisant " avec une liste d'applications.

Merci pour tout conseil.

20
demandé sur Arnold Spence 2012-06-17 07:09:25

2 réponses

merci aux gars de L'intention ouverte, j'ai manqué la réponse la première fois à travers leur code dans leur gestionnaire de fichiers, voici ce que j'ai fini par:

    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 mime de "* / *" alors que vous ne pouvez pas le déterminer à partir du système(il est null ) il lance la boîte de dialogue appropriée select application.

46
répondu stonedonkey 2012-06-19 08:10:44

vous pouvez utiliser des intentions génériques pour ouvrir des fichiers,comme CE Code snippet qui est proposé ici :

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 habituellement que les demandes vérifient l'extension du fichier dans imbriqué si et finalement 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 le code complet dans cette question ou dans ce projet open source . J'espère que cela vous aidera.

1
répondu hasanghaforian 2017-05-23 12:08:54