3

我正在尝试构建一个类似画廊的应用程序,它将在外部存储上执行以下功能:

  • 列出所有包含图像的文件夹
  • 列出所有可供公众使用的图像(不会探查里面的文件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、图片和下载只是为了实验

    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在“图库刷新”方面做得很好,这样我的应用程序也可以接收最新的图库内容,他们是怎么做到的?

4

0 回答 0