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