web-dev-qa-db-fra.com

Android: rafraîchissement de la galerie après l'enregistrement de nouvelles images

Ainsi, dans mon application, j’ai, à un moment donné, enregistré un tas d’images dans un dossier temporaire, et je veux qu’elles apparaissent immédiatement dans la Galerie. Hors redémarrage, ils le font, mais sinon ils ne le font pas. 

J'ai essayé d'utiliser la méthode sendBroadcast:

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
     Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Mais je reçois une erreur de permission:

E/AndroidRuntime( 2628): Java.lang.SecurityException: Permission Denial: not allowed to send broadcast Android.intent.action.MEDIA_MOUNTED from pid=2628, uid=10068

Est-ce que je pourrais manquer une permission dans mon AndroidManifest, ou est-ce que cela n'est tout simplement plus supporté? Merci

18
BHendricks

Code fourni par Petrus dans autre réponse fonctionne pour moi sur KitKat (4.4):

MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
/*
 *   (non-Javadoc)
 * @see Android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(Java.lang.String, Android.net.Uri)
 */
public void onScanCompleted(String path, Uri uri) 
  {
      Log.i("ExternalStorage", "Scanned " + path + ":");
      Log.i("ExternalStorage", "-> uri=" + uri);
  }
    });
19
ymonaraS

J'ai essayé Environment.getExternalStorageDirectory().toString(), mais mon dossier personnalisé n'a pas été trouvé.

Je voulais juste partager mon expérience pour résoudre ce problème.

À la fin, j'avais MediaScannerConnection configuré pour analyser un fichier à la fois et maintenant, le dossier manquant contenant ces images est apparu. Chaque fois que je télécharge chaque image, j'ai appelé MediaScannerConnection et chemin du fichier sous le nom Uri au lieu de dossier lui-même.

En outre, de nombreuses personnes ont demandé pourquoi sendBroadcast cessaient de travailler sur KitKat et la réponse était que sendBroadcast avait été abusé et appelé trop de fois, ce qui avait entraîné l’épuisement de la batterie ou le ralentissement du système. J'espérais utiliser la solution ci-dessus pour le dossier contenant toutes les images, mais cela ne fonctionnait pas sur le dossier. J'espérais que le dossier de recherche exposerait le reste des fichiers du dossier personnalisé, mais ce n'était pas le cas dans mon cas. J'espère trouver une meilleure réponse dans le futur ...

Voici extrait de mon code.

MediaScannerConnection.scanFile(ApplicationContext.context, new String[] { imageFile.getPath() }, null,
              new MediaScannerConnection.OnScanCompletedListener() {
                @Override
                public void onScanCompleted(String path, Uri uri) {
                  Log.i(TAG, "Scanned " + path);
                }
              });
7
user2578151

Essayez celui-ci: Après avoir enregistré votre fichier dans un dossier, écrivez ci-dessous le code

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
4
Nancy Y

Le code ci-dessous concerne tous les appareils permettant d'actualiser la galerie après avoir enregistré l'image.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
       Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
       File f1 = new File("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
       Uri contentUri = Uri.fromFile(f1);
       mediaScanIntent.setData(contentUri);
       sendBroadcast(mediaScanIntent);
   } else {
       sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
   }
   sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
2
Sanjay Bhalani

Je sais qu'il est tard, mais essayez ceci peut fonctionner dans toutes les versions:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
                    Intent mediaScanIntent = new Intent(
                            Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    Uri contentUri = Uri.fromFile(out); //out is your file you saved/deleted/moved/copied
                    mediaScanIntent.setData(contentUri);
                    this.sendBroadcast(mediaScanIntent);
                } else {
                    sendBroadcast(new Intent(
                            Intent.ACTION_MEDIA_MOUNTED,
                            Uri.parse("file://"
                                    + Environment.getExternalStorageDirectory())));
                }
2
WonderSoftwares

Implémentez MediaScannerConnectionClient et ajoutez le code ci-dessous.Fonctionne parfaitement en 4.4 :) 

MediaScannerConnection conn;

public void startScan(String url) {
    imagepath = url;
    if (conn != null)
        conn.disconnect();
    conn = new MediaScannerConnection(activity.this, activity.this);
    conn.connect();
}

@Override
public void onMediaScannerConnected() {
    try {
        conn.scanFile(imagepath, getMimeType(imagepath));
    } catch (Java.lang.IllegalStateException e) {
        //Do something
    }
}

@Override
public void onScanCompleted(String path, Uri uri) {
    conn.disconnect();
}
2
pradeep.k

Utilisez MediaScannerConnection au lieu de SendBroadcast. 

MediaScannerConnection.MediaScannerConnectionClient(
{
    @Override
    public void onScanCompleted(String path, Uri uri) {

        if (path.equals(**your filename**.getAbsolutePath()))
        {
            Log.i("Scan Status", "Completed");
            Log.i("uri: ",uri.toString());

            conn.disconnect();
        }
    }
    @Override
    public void onMediaScannerConnected()
    {
        // TODO Auto-generated method stub
        conn.scanFile(**your file name**.getAbsolutePath(),null);
    }
});

conn.connect();
0
Arunkumar
 FileOutputStream out = new FileOutputStream(file);
            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
//Gallery Refresh Code         

    MediaScannerConnection.scanFile(getActivity(), new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
                /*
                 *   (non-Javadoc)
                 * @see Android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(Java.lang.String, Android.net.Uri)
                 */
                public void onScanCompleted(String path, Uri uri)
                {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });
            out.close();
0