Android获取本机各种类型文件的方法
介绍
本篇介绍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<music> getmusics() { arraylist<music> 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<music> { /**歌曲名*/ 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 < chararray.length; i++) { char c = chararray[i]; if (character.iswhitespace(c)) {// 如果是空格则跳过 continue; } if (ishanzi(c)) {// 如果是汉字 string s = ""; try { // tohanyupinyinstringarray 返回一个字符串数组是因为该汉字可能是多音字,此处只取第一个结果 s = pinyinhelper.tohanyupinyinstringarray(c, format)[0]; sb.append(s); } catch (badhanyupinyinoutputformatcombination e) { e.printstacktrace(); sb.append(s); } } else { // 不是汉字 if (i == 0) { if (isenglish(c)) {// 第一个属于字母,则返回该字母 return string.valueof(c).touppercase(locale.english); } return "#"; // 不是的话返回#号 } } } return sb.tostring(); }
获取视频列表
/** * 获取本机视频列表 * @return */ private static list<video> getvideos() { list<video> videos = new arraylist<video>(); cursor c = null; try { // string[] mediacolumns = { "_id", "_data", "_display_name", // "_size", "date_modified", "duration", "resolution" }; c = mcontentresolver.query(mediastore.video.media.external_content_uri, null, null, null, mediastore.video.media.default_sort_order); while (c.movetonext()) { string path = c.getstring(c.getcolumnindexorthrow(mediastore.video.media.data));// 路径 if (!fileutils.isexists(path)) { continue; } int id = c.getint(c.getcolumnindexorthrow(mediastore.video.media._id));// 视频的id string name = c.getstring(c.getcolumnindexorthrow(mediastore.video.media.display_name)); // 视频名称 string resolution = c.getstring(c.getcolumnindexorthrow(mediastore.video.media.resolution)); //分辨率 long size = c.getlong(c.getcolumnindexorthrow(mediastore.video.media.size));// 大小 long duration = c.getlong(c.getcolumnindexorthrow(mediastore.video.media.duration));// 时长 long date = c.getlong(c.getcolumnindexorthrow(mediastore.video.media.date_modified));//修改时间 video video = new video(id, path, name, resolution, size, date, duration); videos.add(video); } } catch (exception e) { e.printstacktrace(); } finally { if (c != null) { c.close(); } } return videos; }
其中,视频的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<imgfolderbean> getimagefolders() { list<imgfolderbean> folders = new arraylist<imgfolderbean>(); // 扫描图片 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<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))//如果已经添加过 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<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(); for (file file : files) { string path = file.getabsolutepath(); if (fileutils.ispicfile(path)) { imgpaths.add(path); } } return imgpaths; }
获取本机已安装应用列表
/** * 获取已安装apk的列表 */ private static list<appinfo> getappinfos() { arraylist<appinfo> appinfos = new arraylist<appinfo>(); //获取到包的管理者 packagemanager packagemanager = mcontext.getpackagemanager(); //获得所有的安装包 list<packageinfo> installedpackages = packagemanager.getinstalledpackages(0); //遍历每个安装包,获取对应的信息 for (packageinfo packageinfo : installedpackages) { appinfo appinfo = new appinfo(); appinfo.setapplicationinfo(packageinfo.applicationinfo); appinfo.setversioncode(packageinfo.versioncode); //得到icon drawable drawable = packageinfo.applicationinfo.loadicon(packagemanager); appinfo.seticon(drawable); //得到程序的名字 string apkname = packageinfo.applicationinfo.loadlabel(packagemanager).tostring(); appinfo.setapkname(apkname); //得到程序的包名 string packagename = packageinfo.packagename; appinfo.setapkpackagename(packagename); //得到程序的资源文件夹 string sourcedir = packageinfo.applicationinfo.sourcedir; file file = new file(sourcedir); //得到apk的大小 long size = file.length(); appinfo.setapksize(size); system.out.println("---------------------------"); system.out.println("程序的名字:" + apkname); system.out.println("程序的包名:" + packagename); system.out.println("程序的大小:" + size); //获取到安装应用程序的标记 int flags = packageinfo.applicationinfo.flags; if ((flags & applicationinfo.flag_system) != 0) { //表示系统app appinfo.setisuserapp(false); } else { //表示用户app appinfo.setisuserapp(true); } if ((flags & applicationinfo.flag_external_storage) != 0) { //表示在sd卡 appinfo.setisrom(false); } else { //表示内存 appinfo.setisrom(true); } appinfos.add(appinfo); } return appinfos; }
其中,安装包信息的bean类appinfo代码为:
public class appinfo { private applicationinfo applicationinfo; private int versioncode = 0; /** * 图片的icon */ private drawable icon; /** * 程序的名字 */ private string apkname; /** * 程序大小 */ private long apksize; /** * 表示到底是用户app还是系统app * 如果表示为true 就是用户app * 如果是false表示系统app */ private boolean isuserapp; /** * 放置的位置 */ private boolean isrom; /** * 包名 */ private string apkpackagename; ... //此处省略setter和getter方法 }
获取文档、压缩包、apk安装包等
/** * 通过文件类型得到相应文件的集合 **/ private static list<filebean> getfilesbytype(int filetype) { list<filebean> files = new arraylist<filebean>(); // 扫描files文件库 cursor c = null; try { c = mcontentresolver.query(mediastore.files.getcontenturi("external"), new string[]{"_id", "_data", "_size"}, null, null, null); int dataindex = c.getcolumnindex(mediastore.files.filecolumns.data); int sizeindex = c.getcolumnindex(mediastore.files.filecolumns.size); while (c.movetonext()) { string path = c.getstring(dataindex); if (fileutils.getfiletype(path) == filetype) { if (!fileutils.isexists(path)) { continue; } long size = c.getlong(sizeindex); filebean filebean = new filebean(path, fileutils.getfileiconbypath(path)); files.add(filebean); } } } catch (exception e) { e.printstacktrace(); } finally { if (c != null) { c.close(); } } return files; }
传入的filetype文件类型是在fileutils定义的文件类型声明:
/**文档类型*/ public static final int type_doc = 0; /**apk类型*/ public static final int type_apk = 1; /**压缩包类型*/ public static final int type_zip = 2;
其中,fileutils根据文件路径获取文件类型的方法getfiletype(string path)为:
public static int getfiletype(string path) { path = path.tolowercase(); if (path.endswith(".doc") || path.endswith(".docx") || path.endswith(".xls") || path.endswith(".xlsx") || path.endswith(".ppt") || path.endswith(".pptx")) { return type_doc; }else if (path.endswith(".apk")) { return type_apk; }else if (path.endswith(".zip") || path.endswith(".rar") || path.endswith(".tar") || path.endswith(".gz")) { return type_zip; }else{ return -1; } }
文件的bean类filebean代码为:
public class filebean { /** 文件的路径*/ public string path; /**文件图片资源的id,drawable或mipmap文件中已经存放doc、xml、xls等文件的图片*/ public int iconid; public filebean(string path, int iconid) { this.path = path; this.iconid = iconid; } }
fileutils根据文件类型获取图片资源id的方法,getfileiconbypath(path)代码为:
/**通过文件名获取文件图标*/ public static int getfileiconbypath(string path){ path = path.tolowercase(); int iconid = r.mipmap.unknow_file_icon; if (path.endswith(".txt")){ iconid = r.mipmap.type_txt; }else if(path.endswith(".doc") || path.endswith(".docx")){ iconid = r.mipmap.type_doc; }else if(path.endswith(".xls") || path.endswith(".xlsx")){ iconid = r.mipmap.type_xls; }else if(path.endswith(".ppt") || path.endswith(".pptx")){ iconid = r.mipmap.type_ppt; }else if(path.endswith(".xml")){ iconid = r.mipmap.type_xml; }else if(path.endswith(".htm") || path.endswith(".html")){ iconid = r.mipmap.type_html; } return iconid; }
上述各种文件类型的图片放置在mipmap中,用于展示文件列表时展示。
filemanager以及其他类的源码,可以点击下面的网址跳转查看和下载:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。