Android: rafraîchir la galerie après avoir enregistré de nouvelles images

Donc, dans mon application j'ai un point d'enregistrer un tas d'images dans un dossier temporaire, et je veux à apparaître immédiatement dans la Galerie. Après un redémarrage, ils le font, mais autrement 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 j'obtiens 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 ce n'est plus supporté? Merci

15
demandé sur BHendricks 2013-09-05 01:38:01

7 réponses

Essayez ceci, Ça fonctionne pour moi sur Kitkat (4.4) https://stackoverflow.com/a/5814533/640528

        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);
              }
            });
18
répondu ymonaraS 2017-05-23 12:09:01

j'ai essayé Environment.getExternalStorageDirectory().toString(), mais il n'a pas trouver mon dossier personnalisé.

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

À la fin, j'ai eu MediaScannerConnection configuré pour numériser un fichier à la fois et maintenant le dossier manquant qui contenait ces images s'est montré. Chaque fois que je télécharge chaque image, j'appelle MediaScannerConnection et le chemin du fichier comme Uri au lieu du dossier lui-même.

aussi, beaucoup de gens ont demandé pourquoi sendBroadcast arrêtez de travailler sur kitkat et la réponse est que sendBroadcast a été abusé et appelé trop souvent et causant système de vidange de la batterie ou ralentissement, de sorte qu'ils ont supprimé l'appel direct pour prévenir l'abus qui a du sens. J'espérais utiliser la solution ci-dessus pour le dossier qui contient toutes les images, mais cela n'a pas fonctionné sur le dossier. J'espérais que le fait de trouver le dossier exposerait reste des fichiers dans le dossier personnalisé, mais il n'a pas dans mon cas. J'espère trouver une meilleure réponse à l'avenir...

voici un 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);
                }
              });
6
répondu user2578151 2015-10-23 05:57:48

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

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
4
répondu Nancy Y 2016-11-30 12:56:24

implémenter Médiascannerconnectionclient et ajouter 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
répondu pradeep.k 2014-01-20 08:58:59

je sais que sa fin mais essayez ceci peut travailler 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
répondu WonderSoftwares 2015-12-07 12:37:05

ci-dessous le travail de code tout le dispositif pour rafraîchir la galerie après avoir sauvé 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
répondu Sanjay Bhalani 2016-08-31 05:36:13

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
répondu Arunkumar 2014-08-13 09:25:18