前言
最近实验室的项目需要实现–在手机与单反的wifi连接之后,加载单反中的图片.这其中就涉及到我们在Android开发中经常遇到的功能-图片加载.
关于图片加载,不同程度的实现也会遇到不同程度的问题
可能起初我们只是想加载出来一张图片,这个问题很好解决.
后来我们可能还要加载大量的图片(几百KB的那种)到页面上,这个也不是很难…
但是如果想要优雅的做好符合用户体验的图片加载,如何做好缓存.下拉刷新…都是需要做的.
所以最近会写一些关于图片加载的系列博文,希望对大家有所帮助,
前两天做了一个demo,试了试加载手机里的所有图片,算作这个系列的开端.
效果图
这是加了日期分组的效果,这个我们下一篇再讲怎么把按照日期分组的.
查找手机里所有图片的 关键代码:
/**
* 查询手机里所有的图片
*/
public void initAllImgInThePhone() {
String[] projection = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.SIZE
};
//全部图片
String where = MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=?";
//指定格式
String[] whereArgs = {"image/jpeg", "image/png", "image/jpg"};
//查询
Cursor cursor = getContext().getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, where, whereArgs,
MediaStore.Images.Media.DATE_MODIFIED + " desc ");
List<String> dateList = new ArrayList<>();//存放图片的路径
while (cursor.moveToNext()) {
String fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))//获取图片名.
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE));//获取文件大小.
byte[] data = cursor.getBlob(cursor.getColumnIndex(MediaStore.Images.Media.DATA));//图片在手机里的路径
String dataStr = new String(data, 0, data.length - 1);//路径转换成字符串
File file = new File(dataStr);
long time = file.lastModified(); //记录此图片的上次修改时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(time); // 2019-04-10
}
}
通过contentResolver内容提供器,轻松获得所有自己想要的格式的图片,接下来如何加载到屏幕上大家应该都知道.
- 在把每个图片的路径放到list中.
- 把list传给adapter
- 在adapter的onBindViewHolder中,通过图片路径加载图片到对应的ImageView中.
如果还有不清楚的地方,可以到我的仓库查看全部源码>图片加载.
(完~)