Как правильно уведомить MediaScanner о папке даже на устройствах Nexus / Kitkat?

Фон

Я делаю приложение, которое загружает некоторые изображения из Интернета в определенную папку, которая определяется как:

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

Я хочу сделать галерею и любое приложение, которое показывает медиа, чтобы получать уведомления об этих изображениях и иметь возможность их показывать.

К сожалению, у меня проблемы с Nexus 4, который имеет версию Kitkat (точнее 4.4.2). Иногда это работает, а иногда нет.

Проблема

Есть много сообщений по этой проблеме, и я пробовал многие из них, и ни одна не работала, используя простой путь к папке:

используя намерение намерения.ACTION_MEDIA_SCANNER_SCAN_FILE , как показаноВот , Это не сработало ни на одном устройствесоздание экземпляра MediaScannerConnectionClient и сканирование вызовов после установления соединения, как показаноВот а такжеВот , Не уверен, что с этим не так, как это удается подключиться.вызовSCANFILE , как показаноВот с и без слушателя. Это хорошо работало на Galaxy S3, но не на Nexus 4. Это то, что я решил сделать, но я заметил, что он не может работать с одним путем к папке. Вместо этого ему нужен массив файлов для уведомления.Что я пробовал

Вот что я сделал (опять же, он отлично работает на Galaxy S3 с Android 4.3, но иногда не работает на Nexus 4 с Android 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);
        }
    }
}
Вопрос

Как я должен уведомить всю папку для сканирования?

Почему этот метод работает только иногда на Kitkat? Это просто устройства Nexus или другие устройства тоже?

Что следует использовать для поддержки всех устройств и версий Android?

Ответы на вопрос(1)

Ваш ответ на вопрос