Trigger Medienscanner auf bestimmten Pfad (Ordner), wie?

Ich habe diese class:

import android.content.Context; import android.media.MediaScannerConnection; import android.net.Uri; import android.util.Log; public class MediaScannerWrapper implements MediaScannerConnection.MediaScannerConnectionClient { private MediaScannerConnection mConnection; private String mPath; private String mMimeType; // filePath - where to scan; // mime type of media to scan ie "image/jpeg". // use "*/*" for any media public MediaScannerWrapper(Context ctx, String filePath, String mime){ mPath = "/sdcard/DCIM/Camera"; mMimeType = "jpg"; mConnection = new MediaScannerConnection(ctx, this); } // do the scanning public void scan() { mConnection.connect(); } // start the scan when scanner is ready public void onMediaScannerConnected() { mConnection.scanFile(mPath, mMimeType); Log.w("MediaScannerWrapper", "media file scanned: " + mPath); } public void onScanCompleted(String path, Uri uri) { // when scan is completes, update media file tags } } 

Wie benutzt man es in der anderen class? Ich weiß nicht, wie man classn richtig benutzt, ich habe versucht, aber nichts funktioniert. Ich mache etwas falsch, aber ich weiß nicht was, kann mir jemand dabei helfen.

    Die Geschichte

    Vor Android 4.4 konnten wir einfach eine Übertragung senden, um den Medienscanner in einer bestimmten Datei oder einem Ordner oder sogar im Stammverzeichnis des Speichers auszulösen. Aber seit 4.4 KitKat wurde dies von den Android-Entwicklern behoben.

    Warum sage ich fest? Der Grund ist einfach. Senden einer Sendung mit MEDIA_MOUNTED im Stammverzeichnis ist sehr teuer. Das Ausführen des Media Scanners ist eine kostspielige Operation und die Situation wird noch schlimmer, wenn der Benutzer viele Dateien in den Speicher- und Deep-Ordnerstrukturen hat.

    Vor Android 4.4

    Halte es einfach und geradlinig. Wenn Sie Ihre App vor Android 4.4 ausrichten. Aber denken Sie daran, es nicht im Root-Verzeichnis zu verwenden, es sei denn, dies ist absolut notwendig.

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

    Von Android 4.4

    Es gibt zwei Möglichkeiten für Sie.

    i) Der erste ist dem vorherigen Beispiel sehr ähnlich, funktioniert aber möglicherweise nicht effizient und wird auch nicht empfohlen.

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

    ii) Lassen Sie uns nun zu der empfohlenen und effizientesten Lösung für dieses Problem übergehen.

    Fügen Sie die Dateipfade der Dateien, die so aktualisiert wurden, in eine String-ArrayList ein

     ArrayList toBeScanned = new ArrayList(); toBeScanned.add(item.getFilePath()); 

    Jetzt müssen Sie die statische Methode scanFile () der MediaScannerConnection-class ausführen und das String-Array übergeben, das die Liste aller Dateien enthält, die aktualisiert wurden und medienüberprüft werden müssen.

    Sie können auch einen Listener festlegen, der reactjs, wenn der Scanvorgang für einzelne Dateien abgeschlossen wurde.

     String[] toBeScannedStr = new String[toBeScanned.size()]; toBeScannedStr = toBeScanned.toArray(toBeScannedStr); MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { System.out.println("SCAN COMPLETED: " + path); } }); 

    Hey, ich habe herausgefunden, wie man das mit einem sehr einfachen Code macht.

    Rufen Sie einfach diese Codezeile an:

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

    Dies sollte den Medienscanner auslösen.

    In Android gibt es eine Inhaltsdatenbank, die vom Medienscanner verwendet wird, um den gesamten auf dem Gerät vorhandenen Medieninhalt zu verfolgen.

    Wenn Android hochfährt, wird der Medienscanner-Dienst gestartet und durchläuft den gesamten externen Speicher, um festzustellen, ob neuer Medieninhalt vorhanden ist, wenn dieser dann gefunden wird.

    • Es fügt einen Eintrag dieses Medieninhalts in die Inhaltsdatenbank ein
    • Jeder Eintrag in der Inhaltsdatenbank enthält Metadaten des Medieninhalts wie Name, Datum, Dateigröße, Dateityp usw.
    • Wenn Sie also einen Medieninhalt ändern, müssen Sie auch die Inhaltsdatenbank aktualisieren.
    • Wenn die Inhaltsdatenbank nicht aktualisiert wird, können andere Anwendungen nicht auf diesen bestimmten Medieninhalt zugreifen.
    • Das Ausführen des Medienscanners aktualisiert nur die Inhaltsdatenbank

    Anstatt den Medienscanner auszuführen, können Sie die Inhaltsdatenbank selbst aktualisieren, und das Problem sollte getriggers werden.

    Im Folgenden finden Sie eine Erläuterung zum Einfügen, Löschen und Aktualisieren mithilfe des Content-Resolvers. (Suchen Sie nach dem Abschnitt “Einfügen, Aktualisieren und Löschen von Daten”)

    Bearbeiten: Es gibt einen Beispielcode in dieser Antwort . Überprüfen Sie die Antwort von Janusz.

      File file = new File(absolutePath); Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); sendBroadcast(intent); 
     private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } 

    Referenz: http://developer.android.com/training/camera/photobasics.html#TaskGallery

    Das Add the Photo to a Gallery hinzufügen

    Als @Aritra Roys Antwort entscheide ich mich, ein Experiment zu diesem Thema zu machen. Was ich hier habe, sind:

    • Intent.ACTION_MEDIA_MOUNTED und Intent.ACTION_MEDIA_SCANNER_SCAN_FILE können einen individuellen Dateipfad akzeptieren, also sendBroadcast (neue Absicht (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse (filePath))); oder sendBroadcast (neue Absicht (Intent.ACTION_MEDIA_MOUNTED, Uri.parse (filePath))); wird gültig sein.
    • Wenn Sie einen individuellen Dateipfad mit Intent.ACTION_MEDIA_MOUNTED auf Kitkat oder höher verwenden, stürzt Ihre Anwendung weiterhin ab
    • Wenn Sie Intent.ACTION_MEDIA_SCANNER_SCAN_FILE oder MediaScannerConnection auf einem Gerät verwenden, das niedriger als Kitkat ist, wird Ihre Anwendung nicht zwangsweise geschlossen, aber die Methode funktioniert einfach nicht wie gewünscht.

    Von diesem Experiment denke ich, dass es die beste Methode ist

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { MediaScannerConnection.scanFile(context, new String[]{imagePath}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { //something that you want to do } }); } else { context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + imagePath))); } 

    Lass es mich wissen, wenn ich etwas verpasst habe