1、概述
应公司项目需求,要做一个图片选择器,网上搜索了一些源码,我在别人的基础上进行了修改,另外页面也进行了重整,我的是先加载图片文件夹列表,然后再进入选择图片。
参考博客地址:http://blog.csdn.net/lmj623565791/article/details/39943731
修改bug:可以扫描gif文件,并且后缀名是大写的也可以扫描出来 例如:image.GIF
效果图如下:
2.扫描图片文件夹的核心代码,就是开启一个线程去扫描数据库所有图片,然后找到他们 的父路径,再进行去重,利用handle更新ui
new Thread(new Runnable() { @Override public void run() { String firstImage = null; Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver mContentResolver = ImageFolderActivity.this.getContentResolver(); // 只查询jpeg和png和gif的图片 Cursor mCursor = mContentResolver.query(mImageUri, null, MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=? or "+MediaStore.Images.Media.MIME_TYPE +"=?", new String[] {"image/jpeg", "image/png","image/gif"}, MediaStore.Images.Media.DATE_MODIFIED); Log.e("TAG", mCursor.getCount() + ""); HashSet<String> mDirPaths = new HashSet<String>();//临时的辅助类,用于防止同一个文件夹的多次扫描 while (mCursor.moveToNext()) { // 获取图片的路径 String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA)); //Log.e("TAG", path); // 拿到第一张图片的路径 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) { return Util.isImage(fileName); } }).length; imageFloder.setCount(picSize); mImageFloders.add(imageFloder); } mCursor.close(); //通知Handler扫描图片完成 mHandler.sendEmptyMessage(0x110); } }).start();
3.图片列表就是把当前文件夹下的所有文件根据名字后缀名进行过滤,然后展示出来。 放到一个gridView里面
File dirFile=new File(getIntent().getStringExtra(Constant.DIR)); images = Arrays.asList(dirFile.list(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return Util.isImage(filename); } }));