我正在尝试构建类似图库的应用,该应用将在外部存储上执行以下功能:
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上进行了测试,两者都有相同的结果。
有趣的是,如果我打开Instagram并打开&#34;选择画廊&#34;从那里。图库内容正在刷新。所以这意味着Instagram正在进行#34;画廊清新&#34;非常好,以便我的应用程序也可以收到最新的图库内容,他们是如何做到的?