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(){ List folders=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); List mDirs=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){ ArrayList imgPaths=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(){ ArrayList appInfos=newArrayList (); //获取到包的管理者 PackageManagerpackageManager=mContext.getPackageManager(); //获得所有的安装包 List installedPackages=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){ List files=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目录下的文件)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。