问题描述

这个代码里面进入默认显示的是图片数量最多的文件夹,这样的话用户体验不好,一般应该显示拍照的文件夹或最近修改的图片所在的文件夹。

代码分析

直接上关键代码:

看一下查sdcard图片时的代码:

private void getImages() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
return;
}
// 显示进度条
mProgressDialog = ProgressDialog.show(this, null, "正在加载...");
new Thread(new Runnable() {
@Override
public void run() {
String firstImage = null;
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver mContentResolver = Picturepicker.this
.getContentResolver();
// 只查询jpeg和png的图片
Cursor mCursor = mContentResolver.query(mImageUri, null,
MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=?",
new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED);
while (mCursor.moveToNext()) {
// 获取图片的路径
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
// 拿到第一张图片的路径
if (firstImage == null)
firstImage = path;
// 获取该图片的父路径名
File parentFile = new File(path).getParentFile();
if (parentFile == null)
continue;
String dirPath = parentFile.getAbsolutePath();
ImageFloder imageFloder = null;
// 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)
if (mDirPaths.contains(dirPath)) {
continue;
} else {
mDirPaths.add(dirPath);
// 初始化imageFloder
imageFloder = new ImageFloder();
imageFloder.setDir(dirPath);
imageFloder.setFirstImagePath(path);
}
int picSize = parentFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if (filename.endsWith(".jpg")
|| filename.endsWith(".png")
|| filename.endsWith(".jpeg"))
return true;
return false;
}
}).length;
totalCount += picSize;
imageFloder.setCount(picSize);
mImageFloders.add(imageFloder);
if (picSize > mPicsSize) {
mPicsSize = picSize;
mImgDir = parentFile;
}
mCursor.close();
// 扫描完成,辅助的HashSet也就可以释放内存了
mDirPaths = null;
// 通知Handler扫描图片完成
mHandler.sendEmptyMessage(0x110);
}
}).start();
}

代码简单说明:


// 只查询jpeg和png的图片
Cursor mCursor = mContentResolver.query(mImageUri, null,
MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=?",
new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED);

通过ContentResolver查询jpg和png图片。关于排序的方式看一下query方法中参数的说明:

android 微信sdk_加载

sortOrder规定了怎样进行排序,如果传参的话将会按照SQL的order by 规则进行排序,如果不传参将会使用默认排序,这个有可能是无序的。都知道,order by默认正序。ok,这里代码按照

MediaStore.Images.Media.DATE_MODIFIED(修改时间)正排

2.后面就是对游标进行遍历了,通过图片的路径,找到图片所在文件夹的路径,然后展示图片最多的那个文件夹

如何修改

想要获得最近修改的图片所在的文件夹其实很简单,首先修改一下查询语句,改成按修改时间倒叙排,然后去第一张图片所在的文件夹那么就是最近修改的文件夹了。

修改代码:

android 微信sdk_加载_02

在修改时间后面加上“desc”,注意空格。

定义一个Boolean型变量,初始值为true,判断是不是第一张图片,是的话就展示它所在的文件夹里的图片。别忘了注释掉之前的取数量最多的图片的代码.

android 微信sdk_android 微信sdk_03

注释掉之前的:

android 微信sdk_ide_04

这样就会默认显示最近修改的图片所在的文件夹了。

ps:

关于洪洋大神写的代码的一点修改补充,洪洋大神的代码这样修改以后如果最近修改的照片在camera下的话,(去翻一下手机文档目录),如果camera文件夹下结构是这样的,文件A,文件B,文件C,图片1,图片2,我们要的效果应该显示图片1和图片2共两张图片,但事实上会显示5个。其余三个不能转换成图片,显示默认图片,可以看输出日志,这里就不贴了。那多余的3个哪来的呢,就是加载文件A、B、C路径来的。所以应该在将数据绑定view之前再过滤一下。

原代码:

android 微信sdk_加载_05

修改之后,过滤一下,只要jpg和png的格式的

android 微信sdk_加载_06