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

BackgroundI»

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

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 newFilesToScan = new ArrayList();
        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 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)

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