Как правильно уведомить 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?