Jak poprawnie powiadomić MediaScanner o folderze, nawet na urządzeniach Nexus / Kitkat?

tło

Tworzę aplikację, która pobiera niektóre obrazy z Internetu do określonego folderu zdefiniowanego jako:

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

Chcę, aby galeria i każda aplikacja, która pokazuje media, była powiadamiana o tych obrazach i mogła je wyświetlać.

Niestety mam problemy z Nexusem 4, który ma wersję Kitkat (dokładniej 4.4.2). Czasami działa, a czasem nie.

Problem

Istnieje wiele postów na ten temat, a ja wypróbowałem wiele z nich i żaden z nich nie działał przy użyciu prostej ścieżki do folderu:

używając intencji.ACTION_MEDIA_SCANNER_SCAN_FILE , jak pokazanotutaj . To nie zadziałało na żadnym urządzeniuutworzenie instancji MediaScannerConnectionClient i skanowanie połączenia po wykonaniu połączenia, jak pokazanotutaj itutaj . Nie jestem pewien, co jest z tym nie tak, ponieważ połączenie się udaje.połączeniescanFile , jak pokazanotutaj , zi bez słuchacza. To działało dobrze na Galaxy S3, ale nie na Nexusie 4. To właśnie wybrałem, ale zauważyłem, że nie może działać z pojedynczą ścieżką folderu. Zamiast tego potrzebuje szeregu plików do powiadomienia.Co próbowałem

To właśnie zrobiłem (znowu działa dobrze na Galaxy S3 z Androidem 4.3, ale czasami nie działa na Nexusie 4 z Androidem 4.4.2):

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);
        }
    }
}
Pytanie

Jak mam zgłosić skanowanie całego folderu?

Dlaczego ta metoda działa tylko czasami w Kitkat? Czy to tylko urządzenia Nexus, czy też inne urządzenia?

Co powinno być używane do obsługi wszystkich urządzeń i wersji Androida?

questionAnswers(1)

yourAnswerToTheQuestion