android 最近图片,android---仿微信图片加载时默认显示最近修改的图片文件夹

问题描述

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

代码分析

直接上关键代码:

看一下查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();

}

代码简单说明:

1.

// 只查询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方法中参数的说明:

6ee13870a708c9d50ce2ab993731eb24.png

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

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

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

如何修改

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

修改代码:

e4215f472e39dccabee12e8b4678e1f2.png

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

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

81b4687edd178faab3f5165e6e60b72f.png

注释掉之前的:

40504a10c712ff2449fff2bf02fdc8fa.png

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

ps:

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

原代码:

fd8ee7ba5d66f205be728790dfc1a3e9.png

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

de5a158b17f16bfc0547a2b30638d3c7.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值