Миниатюры Android внутри MediaStore не обновляются после вызова MediaScannerConnection.scanFile
Я пытаюсь создать приложение в стиле галереи, которое будет выполнять следующие функции на внешнем хранилище:
- Список всех папок с изображениями внутри
- Перечислите все изображения, которые доступны для общественности (не будут проверять файлы внутри
Android/data
)
Пока я могу перечислить все изображения и папки, которые имеют изображения. Однако позже я обнаружил, что эти изображения и папки не являются новейшими: они не обновляются после того, как я помещаю несколько фотографий (скажем, я просто делаю скриншоты или загружаю некоторые картинки).
И новые картинки не появляются даже после звонка MediaScannerConnection.scanFile
,
Кроме MediaScannerConnection
Я тоже попробовал дорогой Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
метод с указанными папками, и не повезло.
Я просматривал Stackru, а также различные источники с людьми, обсуждающими эту проблему, но ни один из них не может предложить рабочий метод.
Источники, которые я проверял / пробовал:
- http://droidyue.com/blog/2014/01/19/scan-media-files-in-android/
- Запустить mediascanner по определенному пути (папке), как?
Код:
Как я перечисляю все изображения:
private String[] projectionThumbnail = new String[]{MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.DATA};
private Uri uriThumbnail = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;
private String[] projectionFull = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATA};
private Uri uriFull = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_ALL_IMAGES:
return new CursorLoader(getActivity(), uriThumbnail, projectionThumbnail, null, null, MediaStore.Images.Thumbnails._ID + " DESC");
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_ALL_IMAGES:
adapter.changeCursor(cursor);
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
// And here's how I init the CursorLoader
LoaderManager lm = getActivity().getLoaderManager();
lm.initLoader(LOADER_ALL_IMAGES, null, this);
Вот как я начинаю сканировать изображения, я намереваюсь сканировать все внешнее хранилище, но сейчас я просто сканирую DCIM, ФОТОГРАФИИ и ЗАГРУЗКИ только для эксперимента
File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
MediaScannerConnection.scanFile(this,
new String[]{dcim.getAbsolutePath(), pictures.getAbsolutePath(), downloads.getAbsolutePath()}, new String[]{"image/*", "image/*", "image/*"},
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Вопрос:
Я сделал свой тест на Stock 5.0.2 и 4.4, тот же результат на обоих из них.
- Я делаю что-то не так?
- Почему MediaScanner не работает?
Замечания:
Интересно, если я открою Instagram и открою "выбрать галерею" оттуда. Содержание галереи обновляется. Таким образом, это означает, что Instagram очень хорошо "обновляет галерею", так что мое приложение может получать новейший контент галереи, как они это делают?