Android获取本机各种类型文件的方法
介绍
本篇介绍Android获取本机各种类型文件的方法,已经封装成工具类,末尾有源码下载地址。
提示
获取音乐、视频、图片、文档等文件是需要有读取SD卡的权限的,如果是6.0以下的系统,则直接在清单文件中声明SD卡读取权限即可;如果是6.0或以上,则需要动态申请权限。
FileManager的使用
FileManager是封装好的用于获取本机各类文件的工具类,使用方式如:FileManager.getInstance(Contextcontext).getMusics(),使用的是单例模式创建:
privatestaticFileManagermInstance;
privatestaticContextmContext;
publicstaticContentResolvermContentResolver;
privatestaticObjectmLock=newObject();
publicstaticFileManagergetInstance(Contextcontext){
if(mInstance==null){
synchronized(mLock){
if(mInstance==null){
mInstance=newFileManager();
mContext=context;
mContentResolver=context.getContentResolver();
}
}
}
returnmInstance;
}
获取音乐列表
/** *获取本机音乐列表 *@return */ privatestaticListgetMusics(){ ArrayList musics=newArrayList<>(); Cursorc=null; try{ c=mContentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); while(c.moveToNext()){ Stringpath=c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));//路径 if(FileUtils.isExists(path)){ continue; } Stringname=c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));//歌曲名 Stringalbum=c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));//专辑 Stringartist=c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));//作者 longsize=c.getLong(c.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));//大小 intduration=c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));//时长 inttime=c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));//歌曲的id //intalbumId=c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); Musicmusic=newMusic(name,path,album,artist,size,duration); musics.add(music); } }catch(Exceptione){ e.printStackTrace(); }finally{ if(c!=null){ c.close(); } } returnmusics; }
FileUtils中判断文件是否存在的方法isExists(Stringpath),代码为:
/**
*判断文件是否存在
*@parampath文件的路径
*@return
*/
publicstaticbooleanisExists(Stringpath){
Filefile=newFile(path);
returnfile.exists();
}
音乐的bean类Music代码为:
publicclassMusicimplementsComparable{ /**歌曲名*/ privateStringname; /**路径*/ privateStringpath; /**所属专辑*/ privateStringalbum; /**艺术家(作者)*/ privateStringartist; /**文件大小*/ privatelongsize; /**时长*/ privateintduration; /**歌曲名的拼音,用于字母排序*/ privateStringpinyin; publicMusic(Stringname,Stringpath,Stringalbum,Stringartist,longsize,intduration){ 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(Stringname)代码为:
publicstaticStringgetPinyin(Stringstr){
//设置拼音结果的格式
HanyuPinyinOutputFormatformat=newHanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);//设置为大写形式
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//不用加入声调
StringBuildersb=newStringBuilder();
char[]charArray=str.toCharArray();
for(inti=0;i
获取视频列表
/**
*获取本机视频列表
*@return
*/
privatestaticList
其中,视频的bean类Video代码为:
publicclassVideo{
privateintid=0;
privateStringpath=null;
privateStringname=null;
privateStringresolution=null;//分辨率
privatelongsize=0;
privatelongdate=0;
privatelongduration=0;
publicVideo(intid,Stringpath,Stringname,Stringresolution,longsize,longdate,longduration){
this.id=id;
this.path=path;
this.name=name;
this.resolution=resolution;
this.size=size;
this.date=date;
this.duration=duration;
}
...//此处省略setter和getter方法
}
通过本地视频id获取视频缩略图
//获取视频缩略图
privatestaticBitmapgetVideoThumbnail(intid){
Bitmapbitmap=null;
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inDither=false;
options.inPreferredConfig=Bitmap.Config.ARGB_8888;
bitmap=MediaStore.Video.Thumbnails.getThumbnail(mContentResolver,id,MediaStore.Images.Thumbnails.MICRO_KIND,options);
returnbitmap;
}
上面获取视频列表的方法中,Video对象中有一个属性是id,通过传入这个id可以获取到视频缩略图的Bitmap对象。
获取本机所有图片文件夹
/**
*得到图片文件夹集合
*/
privatestaticListgetImageFolders(){
Listfolders=newArrayList();
//扫描图片
Cursorc=null;
try{
c=mContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,
MediaStore.Images.Media.MIME_TYPE+"=?or"+MediaStore.Images.Media.MIME_TYPE+"=?",
newString[]{"image/jpeg","image/png"},MediaStore.Images.Media.DATE_MODIFIED);
ListmDirs=newArrayList();//用于保存已经添加过的文件夹目录
while(c.moveToNext()){
Stringpath=c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));//路径
FileparentFile=newFile(path).getParentFile();
if(parentFile==null)
continue;
Stringdir=parentFile.getAbsolutePath();
if(mDirs.contains(dir))//如果已经添加过
continue;
mDirs.add(dir);//添加到保存目录的集合中
ImgFolderBeanfolderBean=newImgFolderBean();
folderBean.setDir(dir);
folderBean.setFistImgPath(path);
if(parentFile.list()==null)
continue;
intcount=parentFile.list(newFilenameFilter(){
@Override
publicbooleanaccept(Filedir,Stringfilename){
if(filename.endsWith(".jpeg")||filename.endsWith(".jpg")||filename.endsWith(".png")){
returntrue;
}
returnfalse;
}
}).length;
folderBean.setCount(count);
folders.add(folderBean);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(c!=null){
c.close();
}
}
returnfolders;
}
其中,图片文件夹的bean类ImgFolderBean代码为:
publicclassImgFolderBean{
/**当前文件夹的路径*/
privateStringdir;
/**第一张图片的路径,用于做文件夹的封面图片*/
privateStringfistImgPath;
/**文件夹名*/
privateStringname;
/**文件夹中图片的数量*/
privateintcount;
publicImgFolderBean(Stringdir,StringfistImgPath,Stringname,intcount){
this.dir=dir;
this.fistImgPath=fistImgPath;
this.name=name;
this.count=count;
}
...//此处省略setter和getter方法
}
获取图片文件夹下的图片路径的集合
/**
*通过图片文件夹的路径获取该目录下的图片
*/
privatestaticListgetImgListByDir(Stringdir){
ArrayListimgPaths=newArrayList<>();
Filedirectory=newFile(dir);
if(directory==null||!directory.exists()){
returnimgPaths;
}
File[]files=directory.listFiles();
for(Filefile:files){
Stringpath=file.getAbsolutePath();
if(FileUtils.isPicFile(path)){
imgPaths.add(path);
}
}
returnimgPaths;
}
获取本机已安装应用列表
/**
*获取已安装apk的列表
*/
privatestaticListgetAppInfos(){
ArrayListappInfos=newArrayList();
//获取到包的管理者
PackageManagerpackageManager=mContext.getPackageManager();
//获得所有的安装包
ListinstalledPackages=packageManager.getInstalledPackages(0);
//遍历每个安装包,获取对应的信息
for(PackageInfopackageInfo:installedPackages){
AppInfoappInfo=newAppInfo();
appInfo.setApplicationInfo(packageInfo.applicationInfo);
appInfo.setVersionCode(packageInfo.versionCode);
//得到icon
Drawabledrawable=packageInfo.applicationInfo.loadIcon(packageManager);
appInfo.setIcon(drawable);
//得到程序的名字
StringapkName=packageInfo.applicationInfo.loadLabel(packageManager).toString();
appInfo.setApkName(apkName);
//得到程序的包名
StringpackageName=packageInfo.packageName;
appInfo.setApkPackageName(packageName);
//得到程序的资源文件夹
StringsourceDir=packageInfo.applicationInfo.sourceDir;
Filefile=newFile(sourceDir);
//得到apk的大小
longsize=file.length();
appInfo.setApkSize(size);
System.out.println("---------------------------");
System.out.println("程序的名字:"+apkName);
System.out.println("程序的包名:"+packageName);
System.out.println("程序的大小:"+size);
//获取到安装应用程序的标记
intflags=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);
}
returnappInfos;
}
其中,安装包信息的bean类AppInfo代码为:
publicclassAppInfo{
privateApplicationInfoapplicationInfo;
privateintversionCode=0;
/**
*图片的icon
*/
privateDrawableicon;
/**
*程序的名字
*/
privateStringapkName;
/**
*程序大小
*/
privatelongapkSize;
/**
*表示到底是用户app还是系统app
*如果表示为true就是用户app
*如果是false表示系统app
*/
privatebooleanisUserApp;
/**
*放置的位置
*/
privatebooleanisRom;
/**
*包名
*/
privateStringapkPackageName;
...//此处省略setter和getter方法
}
获取文档、压缩包、apk安装包等
/**
*通过文件类型得到相应文件的集合
**/
privatestaticListgetFilesByType(intfileType){
Listfiles=newArrayList();
//扫描files文件库
Cursorc=null;
try{
c=mContentResolver.query(MediaStore.Files.getContentUri("external"),newString[]{"_id","_data","_size"},null,null,null);
intdataindex=c.getColumnIndex(MediaStore.Files.FileColumns.DATA);
intsizeindex=c.getColumnIndex(MediaStore.Files.FileColumns.SIZE);
while(c.moveToNext()){
Stringpath=c.getString(dataindex);
if(FileUtils.getFileType(path)==fileType){
if(!FileUtils.isExists(path)){
continue;
}
longsize=c.getLong(sizeindex);
FileBeanfileBean=newFileBean(path,FileUtils.getFileIconByPath(path));
files.add(fileBean);
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(c!=null){
c.close();
}
}
returnfiles;
}
传入的fileType文件类型是在FileUtils定义的文件类型声明:
/**文档类型*/
publicstaticfinalintTYPE_DOC=0;
/**apk类型*/
publicstaticfinalintTYPE_APK=1;
/**压缩包类型*/
publicstaticfinalintTYPE_ZIP=2;
其中,FileUtils根据文件路径获取文件类型的方法getFileType(Stringpath)为:
publicstaticintgetFileType(Stringpath){
path=path.toLowerCase();
if(path.endsWith(".doc")||path.endsWith(".docx")||path.endsWith(".xls")||path.endsWith(".xlsx")
||path.endsWith(".ppt")||path.endsWith(".pptx")){
returnTYPE_DOC;
}elseif(path.endsWith(".apk")){
returnTYPE_APK;
}elseif(path.endsWith(".zip")||path.endsWith(".rar")||path.endsWith(".tar")||path.endsWith(".gz")){
returnTYPE_ZIP;
}else{
return-1;
}
}
文件的bean类FileBean代码为:
publicclassFileBean{
/**文件的路径*/
publicStringpath;
/**文件图片资源的id,drawable或mipmap文件中已经存放doc、xml、xls等文件的图片*/
publicinticonId;
publicFileBean(Stringpath,inticonId){
this.path=path;
this.iconId=iconId;
}
}
FileUtils根据文件类型获取图片资源id的方法,getFileIconByPath(path)代码为:
/**通过文件名获取文件图标*/
publicstaticintgetFileIconByPath(Stringpath){
path=path.toLowerCase();
inticonId=R.mipmap.unknow_file_icon;
if(path.endsWith(".txt")){
iconId=R.mipmap.type_txt;
}elseif(path.endsWith(".doc")||path.endsWith(".docx")){
iconId=R.mipmap.type_doc;
}elseif(path.endsWith(".xls")||path.endsWith(".xlsx")){
iconId=R.mipmap.type_xls;
}elseif(path.endsWith(".ppt")||path.endsWith(".pptx")){
iconId=R.mipmap.type_ppt;
}elseif(path.endsWith(".xml")){
iconId=R.mipmap.type_xml;
}elseif(path.endsWith(".htm")||path.endsWith(".html")){
iconId=R.mipmap.type_html;
}
returniconId;
}
上述各种文件类型的图片放置在mipmap中,用于展示文件列表时展示。
FileManager以及其他类的源码,可以点击下面的网址跳转查看和下载:
点击查看源码(phone目录下的文件)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。