應公司項目需求,要作一個圖片選擇器,網上搜索了一些源碼,我在別人的基礎上進行了修改,另外頁面也進行了重整,個人是先加載圖片文件夾列表,而後再進入選擇圖片。
參考博客地址:http://blog.csdn.net/lmj623565791/article/details/39943731
修改bug:能夠掃描gif文件,而且後綴名是大寫的也能夠掃描出來 例如:image.GIFjava
效果圖以下:數據庫
2.掃描圖片文件夾的核心代碼,就是開啓一個線程去掃描數據庫全部圖片,而後找到他們 的父路徑,再進行去重,利用handle更新uiide
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裏面ui
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); } }));
點擊下載源碼this