web-dev-qa-db-fra.com

Comment créer un dossier d'images d'application à afficher dans la galerie Android

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?

10
Nemesis

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

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

}

2
jstn

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é!

2
gilonm

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);
}
2
Prince

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();
1
Inayat Khan

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);
                    }
                });
0
Devendra Vaja