第二十篇 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 +
            '}';
}
}

获取音频、视频、文档等,参考:
http://blog.csdn.net/chay_chan/article/details/76984665

获取本地文件夹列表,参考:
http://blog.csdn.net/junzia/article/details/41649063

相关知识链接: 媒体库
http://blog.csdn.net/dlwh_123/article/details/23337913

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调用系统文件管理器打开指定路径目录。

猜你喜欢

转载自blog.csdn.net/hhy113835/article/details/78948976