J'ai une application dans laquelle l'utilisateur crée une image, puis je souhaite l'enregistrer afin qu'elle soit visible depuis l'application de galerie par défaut.
Maintenant, je ne veux pas que les photos soient enregistrées dans le même dossier que les photos prises avec l'appareil photo, mais plutôt dans un dossier dédié à l'application, tout comme les images d'applications telles que WhatsApp ou Facebook.
J'ai essayé de les sauvegarder dans ces deux endroits:
File imagePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ File.separator + appDirectoryName + File.separator);
et ici
File imagePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ File.separator + appDirectoryName + File.separator);
Si je navigue sur le téléphone, je vois que j'ai enregistré les images mais que celles-ci n'apparaissent pas dans l'application Galerie. Il est évident que je manque quelque chose mais je ne sais pas ce que c'est. Peut-être ajouter des métadonnées aux fichiers ou aux dossiers pour que la galerie les reconnaisse?
Eh bien, j'ai trouvé la réponse à la fin.
C'est ce que je soupçonnais. Des métadonnées doivent être ajoutées à l'image enregistrée pour pouvoir être vues dans la galerie (au moins dans mon appareil).
C'est ce que j'ai fait:
OutputStream fOut = null;
File file = new File(imagePath,"GE_"+ System.currentTimeMillis() +".jpg");
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
try {
fOut.flush();
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, this.getString(R.string.picture_title));
values.put(Images.Media.DESCRIPTION, this.getString(R.string.picture_description));
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis ());
values.put(Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode());
values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US));
values.put("_data", file.getAbsolutePath());
ContentResolver cr = getContentResolver();
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Essaye ça
private void createDirectoryAndSaveFile (Bitmap imageToSave, String nomFichier) {
File direct = new File(Environment.getExternalStorageDirectory() + "/DirName"); if (!direct.exists()) { File wallpaperDirectory = new File("/sdcard/DirName/"); wallpaperDirectory.mkdirs(); } File file = new File(new File("/sdcard/DirName/"), fileName); if (file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); }
}
J'ai eu le même problème. La deuxième façon est la bonne, mais vous ne voyez pas les images dans la galerie car la galerie doit être actualisée. Vous pouvez donc attendre quelques instants jusqu'à ce qu'il se mette à jour ou utiliser MediaScanner - look here
J'espère que cela a aidé!
J'ai fait ce qui suit pour le faire fonctionner:
public void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED);
String mCurrentPhotoPath = "file:" + image.getAbsolutePath(); // image is the created file image
File file = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
J'ai essayé cela cela fonctionne parfaitement.
private Uri imageUri;
String getimgname, getimgpath;
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStorageDirectory(), "IMG"+System.currentTimeMillis()+".jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo));
imageUri = Uri.fromFile(photo);
getimgname = photo.getName();
getimgpath = photo.getAbsolutePath();
Essaye ça
MediaScannerConnection.scanFile(context,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});