本次主要实现图片和文件夹的属性描述和设置类,以及读取SD卡图片列表工具类。
1.重点是读取SD卡图片列表并保存到相应的list
public class ImageUtils {
public static void loadImageList(final Context context, final OnLoadImageCallBack callBack) {
new Thread(new Runnable() {
@Override
public void run() {
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.DISPLAY_NAME,
MediaStore.Images.ImageColumns.SIZE,
MediaStore.Images.ImageColumns.DATE_ADDED},
null, null, MediaStore.Images.ImageColumns.DATE_ADDED + " desc");
List<ImageBean> imageBeans = new ArrayList<>();
if (cursor != null) {
ImageBean bean;
while (cursor.moveToNext()) {
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA));
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME));
long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.ImageColumns.SIZE));
long date = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_ADDED));
bean = new ImageBean(id, name, path, size, date);
imageBeans.add(bean);
}
cursor.close();
}
callBack.callBack(splitImage2Folder(imageBeans));
}
}).start();
}
private static List<FolderBean> splitImage2Folder(List<ImageBean> imageList) {
List<FolderBean> folderList = new ArrayList<>();
if (!imageList.isEmpty()) {
// 生成全部图片文件夹
FolderBean allFolder = new FolderBean("全部图片");
for (ImageBean bean : imageList){
if (bean.getSize() > 50 * 1024){
allFolder.addImage(bean);
}
}
folderList.add(allFolder);
// 根据图片路径划分文件夹
for (int i = 0; i < imageList.size(); i++) {
String path = imageList.get(i).getPath();
String name = getFolderName(path);
if (!TextUtils.isEmpty(name)) {
FolderBean folder = getFolder(name, folderList);
folder.addImage(imageList.get(i));
}
}
}
return folderList;
}
private static String getFolderName(String path) {
if (!TextUtils.isEmpty(path)) {
String[] strings = path.split(File.separator);
if (strings.length >= 2) {
return strings[strings.length - 2];
}
}
return "";
}
private static FolderBean getFolder(String name, List<FolderBean> folders) {
for (int i = 0; i < folders.size(); i++) {
FolderBean folder = folders.get(i);
if (name.equals(folder.getName())) {
return folder;
}
}
FolderBean newFolder = new FolderBean(name);
folders.add(newFolder);
return newFolder;
}
public interface OnLoadImageCallBack {
void callBack(List<FolderBean> folderList);
}
}
loadImageList主要用于新建一个线程,该线程在后台读取所有的图片并记录下其基本信息放到ImageBean中
bean = new ImageBean(id, name, path, size, date);
将所有的ImageBean都加到一个列表中,并用splitImage2Folder方法将所有图片划分到不同文件夹。所有过程完成后该线程产生一个callBack。
2.该过程中用到的ImageBean和FolderBean
public class ImageBean implements Serializable{
private long id;
private String name;
private String path;
private long size;
private long date;
private boolean isSelected = false;
public ImageBean() {
}
public ImageBean(long id, String name, String path, long size, long date) {
this.id = id;
this.name = name;
this.path = path;
this.size = size;
this.date = date;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
public class FolderBean {
private String name;
private List<ImageBean> mImageList;
private boolean isSelected = false;
public FolderBean(String name) {
this.name = name;
}
public FolderBean(String name, List<ImageBean> imageList) {
this.name = name;
mImageList = imageList;
}
public void addImage(ImageBean imageBean){
if (mImageList == null){
mImageList = new ArrayList<>();
}
mImageList.add(imageBean);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ImageBean> getImageList() {
return mImageList;
}
public void setImageList(List<ImageBean> imageList) {
mImageList = imageList;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}