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.
Réponses
Trop de publicités?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
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.
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
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.