Wie benachrichtige ich MediaScanner korrekt über einen Ordner, auch auf Nexus / Kitkat-Geräten?

Hintergrund

Ich mache eine App, die einige Bilder aus dem Internet in einen bestimmten Ordner herunterlädt, der wie folgt definiert ist:

final String pathToPutFiles = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            + File.separator + DOWNLOAD_FOLDER_NAME;

Ich möchte die Galerie und jede App, die Medien zeigt, über diese Bilder informieren und sie zeigen können.

Leider habe ich Probleme mit Nexus 4, das die Kitkat-Version (um genau zu sein 4.4.2) hat. Manchmal funktioniert es und manchmal nicht.

Das Problem

Es gibt viele Beiträge zu diesem Problem, und ich habe viele davon ausprobiert. Keiner hat mit einem einfachen Ordnerpfad funktioniert:

mit einer Absicht der Absicht.ACTION_MEDIA_SCANNER_SCAN_FILE , wie gezeigtHier . Dies funktionierte auf keinem GerätErstellen einer Instanz von MediaScannerConnectionClient und Aufrufen der Überprüfung, sobald die Verbindung hergestellt wurde (siehe Abbildung)Hier undHier . Nicht sicher, was daran falsch ist, da die Verbindung erfolgreich hergestellt werden kann.AnrufscanFile , wie gezeigtHier mit und ohne Zuhörer. Auf dem Galaxy S3 funktionierte dies einwandfrei, auf dem Nexus 4 jedoch nicht. Ich habe mich dafür entschieden, aber festgestellt, dass es nicht mit einem einzelnen Ordnerpfad funktioniert. Stattdessen muss ein Array von Dateien benachrichtigt werden.Was ich versucht habe

Dies ist, was ich getan habe (wieder funktioniert es gut auf Galaxy S3, das Android 4.3 hat, aber manchmal funktioniert es nicht auf Nexus 4, das Android 4.4.2 hat):

protected void notifyMediaScannerOfNewImageFiles(final String folderPathToScan) {
        final ArrayList<String> newFilesToScan = new ArrayList<String>();
        preparePaths(folderPathToScan, newFilesToScan, true);
        final String[] newFilesToScanArr = newFilesToScan.toArray(new String[newFilesToScan.size()]);
        MediaScannerConnection.scanFile(getApplicationContext(), newFilesToScanArr, null, null);
}

public static void preparePathsForMediaScanning(final String folderPathToScan, final Collection<String> pathsToFill,
        final boolean recursive) {
    if (TextUtils.isEmpty(folderPathToScan))
        return;
    final File folderToScan = new File(folderPathToScan);
    if (!folderToScan.exists())
        return;
    pathsToFill.add(folderPathToScan);
    if (!folderToScan.isDirectory())
        return;
    final File[] childrenFiles = folderToScan.listFiles();
    if (childrenFiles == null || childrenFiles.length == 0)
        return;
    for (final File childFile : childrenFiles) {
        if (childFile.exists()) {
            final String childFilePath = childFile.getAbsolutePath();
            pathsToFill.add(childFilePath);
            if (recursive && childFile.isDirectory())
                preparePathsForMediaScanning(childFilePath, pathsToFill, true);
        }
    }
}
Die Frage

Wie soll ich einen gesamten zu scannenden Ordner benachrichtigen?

Warum funktioniert diese Methode nur manchmal bei Kitkat? Sind es nur Nexus-Geräte oder auch andere Geräte?

Womit sollten alle Geräte und Android-Versionen unterstützt werden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage