web-dev-qa-db-fra.com

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

J'ai extrait l'image uri, j'aimerais maintenant ouvrir l'image avec la visionneuse d'images par défaut d'Android. Ou mieux encore, l'utilisateur peut choisir le programme à utiliser pour ouvrir l'image. Quelque chose comme File Explorers vous offre si vous essayez d'ouvrir un fichier.

73
Badr Hari

Demandez-moi, répondez-vous aussi:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */

Il vous demandera également quel programme utiliser pour afficher le fichier.

27
Badr Hari

La réponse acceptée ne fonctionnait pas pour moi,

Ce qui avait fonctionné:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");
startActivity(intent);
149
Vikas

Si votre application cible Android N (7.0) et les versions ultérieures, vous ne devez pas utiliser les réponses ci-dessus (de la méthode "Uri.fromFile"), car cela ne fonctionnera pas pour vous.

Au lieu de cela, vous devez utiliser un ContentProvider.

Par exemple, si votre fichier image se trouve dans un dossier externe, vous pouvez utiliser ceci (semblable au code que j'ai créé ici ):

File file = ...;
final Intent intent = new Intent(Intent.ACTION_VIEW)//
                                    .setDataAndType(VERSION.SDK_INT >= VERSION_CODES.N ?
                                                    Android.support.v4.content.FileProvider.getUriForFile(this,getPackageName() + ".provider", file) : Uri.fromFile(file),
                            "image/*").addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

manifeste:

<provider
    Android:name="Android.support.v4.content.FileProvider"
    Android:authorities="${applicationId}.provider"
    Android:exported="false"
    Android:grantUriPermissions="true">
    <meta-data
        Android:name="Android.support.FILE_PROVIDER_PATHS"
        Android:resource="@xml/provider_paths"/>
</provider>

res/xml/provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--<external-path name="external_files" path="."/>-->
    <external-path
        name="files_root"
        path="Android/data/${applicationId}"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>

Si votre image se trouve dans le chemin privé de l'application, vous devez créer votre propre ContentProvider, car j'ai créé "OpenFileProvider" sur le lien.

20
android developer

Essayez de l'utiliser:

Uri uri =  Uri.fromFile(entry);
Intent intent = new Intent(Android.content.Intent.ACTION_VIEW);
String mime = "*/*";
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
if (mimeTypeMap.hasExtension(
    mimeTypeMap.getFileExtensionFromUrl(uri.toString())))
    mime = mimeTypeMap.getMimeTypeFromExtension(
        mimeTypeMap.getFileExtensionFromUrl(uri.toString()));
intent.setDataAndType(uri,mime);
startActivity(intent);
19
Eugene

Basé sur Vikas répond mais avec une légère modification: l'Uri est reçu par paramètre:

private void showPhoto(Uri photoUri){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(photoUri, "image/*");
    startActivity(intent);
}
17
Joaquin Iurchuk

Cette chose pourrait aider si vous travaillez avec Android N et inférieur

 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
5
baswaraj

Une réponse beaucoup plus propre et plus sûre à ce problème (vous ne devriez vraiment pas coder en dur Strings):

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 d’image à la fin du chemin pour le EXTERNAL_CONTENT_URI . Lancez ensuite une intention avec l’action Voir et l’Uri.

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

4
Christopher Perry

Le problème avec l'affichage d'un fichier à l'aide de Intent.ACTION_VIEW est que si vous passez l'analyse Uri du chemin. 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 des fichiers de la base de données dans des objets .MediaFile.getExtension() renvoie une String avec Mimetype pour l'extension de fichier. Exemple: "image/png"


Code additionnel: nécessaire pour afficher n'importe quel 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.

4
IgniteCoders

Toutes les réponses ci-dessus n'ouvrent pas l'image .. quand la deuxième fois j'essaye de l'ouvrir, montrer la galerie et non l'image.

J'ai eu la solution de mélange de diverses SO réponses .. 

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-ci ne fonctionnait que pour moi ..

4
Ranjith Kumar

J'utilise ça ça marche pour moi

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

Presque AUCUNE chance d'utiliser une application de photo ou de galerie (il peut en exister une), mais vous pouvez essayer le visualiseur de contenu.

Merci de commander une autre réponse à une question similaire ici

0
TeeTracker

Ma solution 

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/your_app_folder/"+"your_picture_saved_name"+".png")), "image/*");
context.startActivity(intent);
0
knightcube

Ma solution utilisant un fournisseur de fichiers

    private void viewGallery(File file) {

 Uri mImageCaptureUri = FileProvider.getUriForFile(
  mContext,
  mContext.getApplicationContext()
  .getPackageName() + ".provider", file);

 Intent view = new Intent();
 view.setAction(Intent.ACTION_VIEW);
 view.setData(mImageCaptureUri);
 List < ResolveInfo > resInfoList =
  mContext.getPackageManager()
  .queryIntentActivities(view, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo: resInfoList) {
  String packageName = resolveInfo.activityInfo.packageName;
  mContext.grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
 }
 view.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);
 intent.setDataAndType(mImageCaptureUri, "image/*");
 mContext.startActivity(intent);
}
0
creativecoder