欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android获取本机各种类型文件的方法

程序员文章站 2023-12-09 20:48:45
介绍 本篇介绍android获取本机各种类型文件的方法,已经封装成工具类,末尾有源码下载地址。 提示 获取音乐、视频、图片、文档等文件是需要有读取sd卡的权限的,如果...

介绍

本篇介绍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以及其他类的源码,可以点击下面的网址跳转查看和下载:

点击查看源码(phone目录下的文件)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。