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.

178voto

Vikas Points 6242

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

Ce qui avait marché :

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

39voto

android developer Points 20939

Si votre application cible Android N (7.0) et plus, 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 est dans un dossier externe, vous pouvez utiliser ceci (similaire au code que j'ai fait aquí ) :

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

manifeste :

<provider
    android:name="androidx.core.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 est dans le chemin privé de l'application, vous devez créer votre propre ContentProvider, comme j'ai créé "OpenFileProvider" sur le lien.

33voto

Badr Hari Points 2035

Me demander, me répondre 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 visualiser le fichier.

21voto

Eugene Points 71

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);

18voto

joaquin Points 29

Sur la base de Réponse de Vikas 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);
}

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