it-swarm.com.de

Android: Aktualisierung der Galerie nach dem Speichern neuer Bilder

In meiner Anwendung speichere ich also einige Bilder in einem temporären Ordner, und ich möchte, dass sie sofort in der Galerie angezeigt werden. Nach einem Neustart tun sie das, aber ansonsten nicht. 

Ich habe es mit der sendBroadcast-Methode versucht:

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

Ich bekomme aber einen Erlaubnisfehler:

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

Könnte mir eine Berechtigung in meinem AndroidManifest fehlen oder wird diese einfach nicht mehr unterstützt? Vielen Dank

18
BHendricks

Code von Petrus in eine andere Antwort arbeitet für mich an 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

Ich habe Environment.getExternalStorageDirectory().toString() ausprobiert, aber mein benutzerdefinierter Ordner wurde nicht gefunden.

Ich wollte nur meine Erfahrungen zur Lösung dieses Problems teilen.

Am Ende hatte ich MediaScannerConnection so konfiguriert, dass jeweils eine Datei gescannt wurde. Nun fehlte der Ordner, in dem sich die Bilder befanden. Jedes Mal, wenn ich jedes Bild herunterlade, rief ich MediaScannerConnection und den Dateipfad als Uri und nicht als Ordner an.

Außerdem fragten viele Leute, warum sendBroadcast aufhören sollte, KitKat zu verwenden, und die Antwort ist, dass sendBroadcast zu oft missbraucht und aufgerufen wurde und das System die Batterie erschöpft oder langsamer wird. Daher wurde der direkte Anruf entfernt, um einen sinnvollen Missbrauch zu verhindern. Ich hatte gehofft, die obige Lösung für den Ordner zu verwenden, der alle Bilder enthält, aber der Ordner funktionierte nicht. Ich hatte gehofft, dass der Suchordner den Rest der Dateien innerhalb des benutzerdefinierten Ordners freigeben würde, aber in meinem Fall nicht. Ich hoffe, in Zukunft eine bessere Antwort zu finden ...

Hier ist ein Ausschnitt meines Codes.

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

Versuchen Sie Folgendes: Nachdem Sie Ihre Datei in einem Ordner gespeichert haben, geben Sie den Code ein

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

Unter dem Code funktionieren alle Geräte zum Aktualisieren der Galerie nach dem Speichern des Bildes.

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

Ich weiß, es ist spät, aber probieren Sie das kann in allen Versionen:

   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

Implementiere MediaScannerConnectionClient und füge den folgenden Code hinzu. Arbeitet perfekt in 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

Verwenden Sie MediaScannerConnection anstelle von 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();