История
До Android 4.4 мы могли просто отправить широковещательную рассылку, чтобы запустить медиа-сканер для любого конкретного файла, папки или даже в корне хранилища. Но в 4.4 KitKat это было исправлено разработчиками Android.
Почему я говорю исправлено? Причина проста. Отправка трансляции с использованием MEDIA_MOUNTED в корневом каталоге очень дорога. Запуск Media Scanner - дорогостоящая операция, и ситуация становится еще хуже, когда у пользователя много файлов в хранилище и структурах глубоких папок.
До Android 4.4
Держите это прямо и просто. Если вы ориентируетесь на свое приложение до Android 4.4. Но имейте в виду, что не используйте его в корневом каталоге, если это не является абсолютно необходимым.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Из Android 4.4
Есть два пути для вас.
i) Первый очень похож на предыдущий пример, но может работать неэффективно и не рекомендуется.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
ii) Теперь перейдем к наиболее рекомендуемому и эффективному решению этой проблемы.
Добавьте пути к файлам файлов, которые были обновлены, например, в строковый тип ArrayList
ArrayList<String> toBeScanned = new ArrayList<String>();
toBeScanned.add(item.getFilePath());
Теперь вам нужно запустить статический метод scanFile () класса MediaScannerConnection и передать массив String, содержащий список всех файлов, которые были обновлены и должны быть отсканированы.
Вы также можете заставить слушателя отвечать, когда сканирование отдельных файлов завершено.
String[] toBeScannedStr = new String[toBeScanned.size()];
toBeScannedStr = toBeScanned.toArray(toBeScannedStr);
MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
System.out.println("SCAN COMPLETED: " + path);
}
});