Android獲取本機各種型別檔案列表(音樂、影片、圖片、文件等)

davidtim發表於2021-09-09

介紹

本篇介紹Android獲取本機各種型別檔案的方法,已經封裝成工具類,末尾有原始碼下載地址。

提示

獲取音樂、影片、圖片、文件等檔案是需要有讀取SD卡的許可權的,如果是6.0以下的系統,則直接在清單檔案中宣告SD卡讀取許可權即可;如果是6.0或以上,則需要動態申請許可權。

FileManager的使用

FileManager是封裝好的用於獲取本機各類檔案的工具類,使用方式如:FileManager.getInstance(Context context).getMusics(),使用的是單例模式建立:

private static FileManager mInstance;private static Context mContext;public static ContentResolver mContentResolver;private static Object mLock = new Object();public static FileManager getInstance(Context context){     if (mInstance == null){         synchronized (mLock){             if (mInstance == null){
                 mInstance = new FileManager();
                 mContext = context;
                 mContentResolver = context.getContentResolver();
             }
         }
     }    return mInstance;
}

獲取音樂列表

/**
 * 獲取本機音樂列表
 * @return
 */private static List getMusics() {
    ArrayList musics = new ArrayList();
    Cursor c = null;    try {
        c = mContentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
                MediaStore.Audio.Media.DEFAULT_SORT_ORDER);        while (c.moveToNext()) {
            String path = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));// 路徑

            if (FileUtils.isExists(path)) {                continue;
            }

            String name = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); // 歌曲名
            String album = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); // 專輯
            String artist = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); // 作者
            long size = c.getLong(c.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));// 大小
            int duration = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));// 時長
            int time = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));// 歌曲的id
            // int albumId = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

            Music music = new Music(name, path, album, artist, size, duration);
            musics.add(music);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {        if (c != null) {
            c.close();
        }
    }    return musics;
}

FileUtils中判斷檔案是否存在的方法isExists(String path),程式碼為:

/**
 * 判斷檔案是否存在
 * @param path 檔案的路徑
 * @return
 */public static boolean isExists(String path) {
    File file = new File(path);    return file.exists();
}

音樂的bean類Music程式碼為:

public class Music implements Comparable {
    /**歌曲名*/
    private String name;    /**路徑*/
    private String path;    /**所屬專輯*/
    private String album;    /**藝術家(作者)*/
    private String artist;    /**檔案大小*/
    private long size;    /**時長*/
    private int duration;    /**歌曲名的拼音,用於字母排序*/
    private String pinyin;    public Music(String name, String path, String album, String artist, long size, int duration) {        this.name = name;        this.path = path;        this.album = album;        this.artist = artist;        this.size = size;        this.duration = duration;
        pinyin = PinyinUtils.getPinyin(name);
    }

    ... //此處省略setter和getter方法}

PinyinUtils根據名字獲取拼音,主要是用於音樂列表A-Z的排序,需要依賴pinyin4j.jar,獲取拼音的方法getPinyin(String name)程式碼為:

public static String getPinyin(String str) {    // 設定拼音結果的格式
    HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
    format.setCaseType(HanyuPinyinCaseType.UPPERCASE);// 設定為大寫形式
    format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不用加入聲調

    StringBuilder sb = new StringBuilder();    char[] charArray = str.toCharArray();    for (int i = 0; i 

獲取影片列表

/**
 * 獲取本機影片列表
 * @return
 */private static List

其中,影片的bean類Video程式碼為:

public class Video {    private int id = 0;    private String path = null;    private String name = null;    private String resolution = null;// 解析度
    private long size = 0;    private long date = 0;    private long duration = 0;    public Video(int id, String path, String name, String resolution, long size, long date, long duration) {        this.id = id;        this.path = path;        this.name = name;        this.resolution = resolution;        this.size = size;        this.date = date;        this.duration = duration;
    }

    ... //此處省略setter和getter方法}

透過本地影片id獲取影片縮圖

// 獲取影片縮圖private static Bitmap getVideoThumbnail(int id) {
    Bitmap bitmap = null;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inDither = false;
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    bitmap = MediaStore.Video.Thumbnails.getThumbnail(mContentResolver, id, MediaStore.Images.Thumbnails.MICRO_KIND, options);    return bitmap;
}

上面獲取影片列表的方法中,Video物件中有一個屬性是id,透過傳入這個id可以獲取到影片縮圖的Bitmap物件。

獲取本機所有圖片資料夾

/**
 * 得到圖片資料夾集合
 */private static List getImageFolders() {    List folders = new ArrayList();    // 掃描圖片
    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"}, MediaStore.Images.Media.DATE_MODIFIED);        List mDirs = new ArrayList();//用於儲存已經新增過的資料夾目錄
        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))//如果已經新增過
                continue;

            mDirs.add(dir);//新增到儲存目錄的集合中
            ImgFolderBean folderBean = new ImgFolderBean();
            folderBean.setDir(dir);
            folderBean.setFistImgPath(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;
}

其中,圖片資料夾的bean類ImgFolderBean程式碼為:

public class ImgFolderBean {
    /**當前資料夾的路徑*/
    private String dir;    /**第一張圖片的路徑,用於做資料夾的封面圖片*/
    private String fistImgPath;    /**資料夾名*/
    private String name;    /**資料夾中圖片的數量*/
    private int count;    public ImgFolderBean(String dir, String fistImgPath, String name, int count) {        this.dir = dir;        this.fistImgPath = fistImgPath;        this.name = name;        this.count = count;
    }

    ... //此處省略setter和getter方法}

獲取圖片資料夾下的圖片路徑的集合

/**
 * 透過圖片資料夾的路徑獲取該目錄下的圖片
 */private static List getImgListByDir(String dir) {
    ArrayList imgPaths = new ArrayList();
    File directory = new File(dir);    if (directory == null || !directory.exists()) {        return imgPaths;
    }
    File[] files = directory.listFiles();    for (File file : files) {
        String path = file.getAbsolutePath();        if (FileUtils.isPicFile(path)) {
            imgPaths.add(path);
        }
    }    return imgPaths;
}

獲取本機已安裝應用列表

/**
 * 獲取已安裝apk的列表
 */private static List

原文連結:http://www.apkbus.com/blog-917385-68584.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2813782/,如需轉載,請註明出處,否則將追究法律責任。

相關文章