1. 程式人生 > >第二十篇 Android獲取本機圖片、音訊、視訊、文件以及本地資料夾列表

第二十篇 Android獲取本機圖片、音訊、視訊、文件以及本地資料夾列表

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呼叫系統檔案管理器開啟指定路徑目錄。