Миниатюры Android внутри MediaStore не обновляются после вызова MediaScannerConnection.scanFile

Я пытаюсь создать приложение в стиле галереи, которое будет выполнять следующие функции на внешнем хранилище:

  • Список всех папок с изображениями внутри
  • Перечислите все изображения, которые доступны для общественности (не будут проверять файлы внутри Android/data)

Пока я могу перечислить все изображения и папки, которые имеют изображения. Однако позже я обнаружил, что эти изображения и папки не являются новейшими: они не обновляются после того, как я помещаю несколько фотографий (скажем, я просто делаю скриншоты или загружаю некоторые картинки).

И новые картинки не появляются даже после звонка MediaScannerConnection.scanFile,

Кроме MediaScannerConnectionЯ тоже попробовал дорогой Intent.ACTION_MEDIA_SCANNER_SCAN_FILE метод с указанными папками, и не повезло.

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

Источники, которые я проверял / пробовал:

Код:

Как я перечисляю все изображения:

    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, тот же результат на обоих из них.

  1. Я делаю что-то не так?
  2. Почему MediaScanner не работает?

Замечания:

Интересно, если я открою Instagram и открою "выбрать галерею" оттуда. Содержание галереи обновляется. Таким образом, это означает, что Instagram очень хорошо "обновляет галерею", так что мое приложение может получать новейший контент галереи, как они это делают?

0 ответов

Другие вопросы по тегам