91 votes

Ouvrir une image à l'aide d'un URI dans la visionneuse d'images de la galerie par défaut d'Android

J'ai extrait l'uri de l'image, maintenant je voudrais ouvrir l'image avec le visualisateur d'image par défaut d'Android. Ou mieux encore, l'utilisateur pourrait choisir le programme à utiliser pour ouvrir l'image. Quelque chose comme les explorateurs de fichiers vous proposent si vous essayez d'ouvrir un fichier.

12voto

baswaraj Points 366

Cette chose pourrait vous aider si vous travaillez avec Android N et moins.

 File file=new File(Environment.getExternalStorageDirectory()+"/directoryname/"+filename);
        Uri path= FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider",file);

        Intent intent=new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(path,"image/*");
        intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory

6voto

Christopher Perry Points 7972

Une réponse beaucoup plus propre et plus sûre à ce problème (vous ne devriez vraiment pas coder en dur les chaînes de caractères) :

public void openInGallery(String imageId) {
  Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendPath(imageId).build();
  Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(intent);
}

Tout ce que vous avez à faire est d'ajouter l'identifiant de l'image à la fin du chemin d'accès de l'image. EXTERNAL_CONTENT_URI . Puis lancez un Intent avec l'action View, et l'Uri.

L'identifiant de l'image provient de l'interrogation du résolveur de contenu.

4voto

Ranjith Kumar Points 8125

Toutes les réponses ci-dessus n'ouvrent pas l'image. Quand la deuxième fois que j'essaie de l'ouvrir, elle montre la galerie et non l'image.

J'ai trouvé la solution en mélangeant les réponses des différents SO

Intent galleryIntent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setDataAndType(Uri.fromFile(mImsgeFileName), "image/*");
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(galleryIntent);

Celui-là n'a marché que pour moi

4voto

MansApps Points 219

Le problème de l'affichage d'un fichier en utilisant Intent.ACTION_VIEW est que si vous passez l'option Uri analyse du chemin. Cela ne fonctionne pas dans tous les cas. Pour résoudre ce problème, vous devez utiliser :

Uri.fromFile(new File(filePath));

Au lieu de :

Uri.parse(filePath);

Modifier

Voici mon code complet :

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(mediaFile.filePath)), mediaFile.getExtension());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Info

MediaFile est ma classe de domaine pour envelopper les fichiers de la base de données dans des objets. MediaFile.getExtension() renvoie un String avec Mimetype pour l'extension du fichier. Exemple : "image/png"


Code supplémentaire : nécessaire pour afficher tout fichier (extension)

import android.webkit.MimeTypeMap;

public String getExtension () {
    MimeTypeMap myMime = MimeTypeMap.getSingleton();
    return myMime.getMimeTypeFromExtension(MediaFile.fileExtension(filePath));
}

public static String fileExtension(String path) {
    if (path.indexOf("?") > -1) {
        path = path.substring(0, path.indexOf("?"));
    }
    if (path.lastIndexOf(".") == -1) {
        return null;
    } else {
        String ext = path.substring(path.lastIndexOf(".") + 1);
        if (ext.indexOf("%") > -1) {
            ext = ext.substring(0, ext.indexOf("%"));
        }
        if (ext.indexOf("/") > -1) {
            ext = ext.substring(0, ext.indexOf("/"));
        }
        return ext.toLowerCase();
    }
}

Faites-moi savoir si vous avez besoin de plus de code.

3voto

MuhammadAamirALi Points 2555

Je l'utilise, ça marche pour moi

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X