第二十篇 Android獲取本機圖片、音訊、視訊、文件以及本地資料夾列表
阿新 • • 發佈:2019-01-27
android獲取本機圖片資料夾,即相簿,以及相簿下的所有圖片的方法,貼出工具類,方便後續使用,效果圖就類似百度網盤上傳圖片的 選擇相簿介面和點選某個相簿選擇圖片的介面.
FileManager類:
public class FileManager { private static FileManager mInstance; private static Context mContext; private static ContentResolver mContentResolver; public static FileManager getInstance(Context context) { if (mInstance == null) { synchronized (FileManager.class) { if (mInstance == null) { mInstance = new FileManager(); mContext = context; mContentResolver = context.getContentResolver(); } } } return mInstance; } /** * 得到圖片資料夾集合 */ public List<ImgFolder> getImageFolders() { List<ImgFolder> folders = new ArrayList<ImgFolder>(); // 掃描圖片 Cursor c = null; try { c = mContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media.MIME_TYPE + "= ? or " + MediaStore.Images.Media.MIME_TYPE + "= ?", new String[]{"image/jpeg", "image/png"}, "date_modified desc"); List<String> mDirs = new ArrayList<String>();//用於儲存已經新增過的資料夾目錄 while (c.moveToNext()) { String path = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));// 路徑 File parentFile = new File(path).getParentFile(); if (parentFile == null) continue; String dir = parentFile.getAbsolutePath(); if (mDirs.contains(dir)) {//如果已經新增過 //追加三張圖片 for (ImgFolder folder : folders) { if (folder.getDir().equals(dir)) {//取出當前資料夾 String[] imgPaths = folder.getPreFourImgPath().split(","); if (imgPaths.length >= 4) { break; } else { folder.setPreFourImgPath(folder.getPreFourImgPath() + path + ","); } } } continue; } mDirs.add(dir);//新增到儲存目錄的集合中 ImgFolder folderBean = new ImgFolder(); folderBean.setDir(dir); folderBean.setPreFourImgPath(path + ","); if (parentFile.list() == null) continue; int count = parentFile.list(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { if (filename.endsWith(".jpeg") || filename.endsWith(".jpg") || filename.endsWith(".png")) { return true; } return false; } }).length; folderBean.setCount(count); folders.add(folderBean); } } catch (Exception e) { e.printStackTrace(); } finally { if (c != null) { c.close(); } } return folders; } /** * 通過圖片資料夾的路徑獲取該目錄下的圖片 */ public List<String> getImgListByDir(String dir) { ArrayList<String> imgPaths = new ArrayList<>(); File directory = new File(dir); if (directory == null || !directory.exists()) { return imgPaths; } File[] files = directory.listFiles(); //對檔案進行排序 Arrays.sort(files, new FileComparator()); for (File file : files) { String path = file.getAbsolutePath(); if (FileManager.isPicFile(path)) { imgPaths.add(path); } } return imgPaths; } /** * 是否是圖片檔案 */ public static boolean isPicFile(String path) { path = path.toLowerCase(); if (path.endsWith(".jpg") || path.endsWith(".jpeg") || path.endsWith(".png")) { return true; } return false; } class FileComparator implements Comparator<File> { @Override public int compare(File lhs, File rhs) { if (lhs.lastModified() < rhs.lastModified()) { return 1; } else { return -1; } } } }
ImageFolder類:
public class ImgFolder { /**當前資料夾的路徑*/ private String dir; /**前四張圖片的路徑,用逗號分隔*/ private String preFourImgPath; /**資料夾名*/ private String name; /**資料夾中圖片的數量*/ private int count; public String getDir() { return dir; } public void setDir(String dir) { this.dir = dir; int lastIndex = dir.lastIndexOf("/"); this.name = dir.substring(lastIndex + 1); } public String getPreFourImgPath() { return preFourImgPath; } public void setPreFourImgPath(String preFourImgPath) { this.preFourImgPath = preFourImgPath; } public String getName() { return name; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void setName(String name) { this.name = name; } public ImgFolder() { } public ImgFolder(String dir, String preFourImgPath, String name, int count) { this.dir = dir; this.preFourImgPath = preFourImgPath; this.name = name; this.count = count; } @Override public String toString() { return "ImgFolder{" + "dir='" + dir + '\'' + ", preFourImgPath='" + preFourImgPath + '\'' + ", name='" + name + '\'' + ", count=" + count + '}'; } }
1.Images表:主要儲存images資訊。
2.Thumbnails表:這個表和images表是有直接關係的。主要儲存圖片的縮圖,Android為每一張儲存進系統的圖片檔案都會自動生成一張縮圖檔案。
3.Video表:主要儲存視訊資訊了。和images表類似。
4.Videothumbnails表:儲存視訊的縮圖資訊。這個和thumbnails表類似。
5.Audio表:音訊資訊比視訊資訊和圖片資訊要稍微複雜一些,主要是儲存了一些專輯(album)、歌手(artists)資訊,而專輯和歌手資訊是單獨的表格儲存的,audio其實是一個檢視,真正的音訊資料資訊儲存在audio_meta表格中。
6.Albums表:主要儲存專輯資訊。
7.Artists表:主要儲存歌手資訊。
8.audio_playlists檢視:媒體庫的播放列表。
9.audio_media檢視:真正的音訊資料儲存在這裡。
補充:如果不想搞那麼複雜,可以直接intent呼叫系統檔案管理器開啟指定路徑目錄。