调用MediaScannerConnection.scanFile后,MediaStore内的Android缩略图无法刷新

时间:2015-04-02 17:10:49

标签: android mediastore android-mediascanner

我正在尝试构建类似图库的应用,该应用将在外部存储上执行以下功能:

  • 列出其中包含图片的所有文件夹
  • 列出所有可供公众使用的图像(不会探测Android/data内的文件)

到目前为止,我可以列出所有图像和包含图像的文件夹。然而,我后来发现这些图像和文件夹不是最新的:它们在我放了一些图片之后没有得到刷新(比如我只是做一些截图或下载一些图片)。

即使我致电MediaScannerConnection.scanFile后,新照片也不会出现。

MediaScannerConnection之外,我还尝试使用指定文件夹的昂贵Intent.ACTION_MEDIA_SCANNER_SCAN_FILE方法,但没有运气。

我在浏览StackOverflow以及与人们讨论此问题的各种来源时,但他们都没有提供工作方法。

我已检查/尝试的来源:

代码:

我如何列出所有图片:

    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,PICTURES和DOWNLOADS

    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无法正常工作?
  3. 注意:

    有趣的是,如果我打开Instagram并打开&#34;选择画廊&#34;从那里。图库内容正在刷新。所以这意味着Instagram正在进行#34;画廊清新&#34;非常好,以便我的应用程序也可以收到最新的图库内容,他们是如何做到的?

0 个答案:

没有答案