##一、首先看效果
##二、文件管理器的界面
###有两大块部分:
####这第一部分是分类查找:
按照文件类型进行分类,代码逻辑是按照常见的文件后缀名对文件进行分类,主要是文本、视频、音频三大类,其他的文件类型都放在了最后一栏中;
####第二部分是按照文件目录,逐级地浏览文件:
1.首先有个概念需要区分下,即内置SD卡和外置SD卡:
内置SD卡:被预设到电子设置的内部,不可随意拆卸,不可扩充容量;
外置SD卡:即插即用,可随意更换升级;
2.这里首先需要判断手机中是否存在外置的SD卡,如果存在就显示其中的文件目录,如果不存在,就不显示这一栏;
那么有个问题是,如何判断呢?代码如下,可以直接使用,返回外置sd卡的路径:
public String getSDCardPath() {
String SDCardPath = null;
String SDCardDefaultPath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
if (SDCardDefaultPath.endsWith("/")) {
SDCardDefaultPath = SDCardDefaultPath.substring(0, SDCardDefaultPath.length() - 1);
}
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("mount");
InputStream inputStream = process.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
String line;
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
while ((line = bufferedReader.readLine()) != null) {
if (line.toLowerCase().contains("sdcard") && line.contains(".android_secure")) {
String[] array = line.split(" ");
if (array != null && array.length > 1) {
String temp = array[1].replace("/.android_secure", "");
if (!SDCardDefaultPath.equals(temp)) {
SDCardPath = temp;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return SDCardPath;
}
##三、逐级浏览文件目录的实现
核心思想:从手机SD卡的根目录开始,首先获得这个根目录下的文件,然后判断这些文件是文件夹还是文件,如果是文件夹,则这个文件夹是下一级文件目录的根目录;
怎么实现从手机SD卡的根目录开始,首先获得这个根目录下的文件?
1、获取到手机SD卡的根目录,内置的SD卡的根目录的路径获取:
String path = Environment.getExternalStorageDirectory().getPath();
File currentDir = new File(path);
2、获取手机外置的根目录在上边已经说明了;
3、获取手机某个目录下的所有文件,其中有个FileFilter接口,它的作用就是把手机中的隐藏文件给过滤掉:
File[] files = params[0].listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.isHidden();
}
});
怎么实现每一级文件目录的展示呢?并且做到在你按下back键的时候可以逐级返回到上级目录?
思想:每一级的文件目录用一个fragment,来进行展示,然后把这个fragment加入到back stack中,在你按下back键的时候,就可以达到逐级返回上级目录的目的。
public void showFragment(Fragment fragment) {
fragmentCount++;
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.rc_ac_fl_storage_folder_list_fragment, fragment)
.commitAllowingStateLoss();
}
上面的代码中addToBackStack()这个方法的作用就是将fragment加入到back stack中;
这里展示文件目录的fragment中就是一个ListView,里边展示文件夹和文件,这里做了排序。
排序的思想就是:将文件夹排在前面,文件排在后边;
文件夹内部排序思想是:依次为数字、英文字母、中文;
Collections.sort(fileInfos, new FileTypeUtils.FileNameComparator());
public static class FileNameComparator implements Comparator<FileInfo> {
protected final static int
FIRST = -1,
SECOND = 1;
@Override
public int compare(FileInfo lhs, FileInfo rhs) {
if (lhs.isDirectory() || rhs.isDirectory()) {
if (lhs.isDirectory() == rhs.isDirectory())
return lhs.getFileName().compareToIgnoreCase(rhs.getFileName());
else if (lhs.isDirectory()) return FIRST;
else return SECOND;
}
return lhs.getFileName().compareToIgnoreCase(rhs.getFileName());
}
}
##四、文件分类展示
核心思想:从一个根目录下,对下面的所有文件进行遍历,然后根据文件后缀名,对文件进行筛选,把符合条件的文件展示出来;
这是一个耗时的操作,所以需要在子线程中进行;
那么怎么根据文件名对文件进行筛选呢?
下面我以图片文件为例,来进行阐述:
<resources>
<array name="rc_image_file_suffix">
<item>.bmp</item>
<item>.cod</item>
<item>.gif</item>
<item>.ief</item>
<item>.jpe</item>
<item>.jpeg</item>
<item>.jpg</item>
<item>.jfif</item>
<item>.svg</item>
<item>.tif</item>
<item>.tiff</item>
<item>.ras</item>
<item>.ico</item>
<item>.pbm</item>
<item>.pgm</item>
<item>.png</item>
<item>.pnm</item>
<item>.ppm</item>
<item>.xbm</item>
<item>.xpm</item>
<item>.xwd</item>
<item>.rgb</item>
</array>
</resources>
上面列的是图片文件的后缀名,然后根据文件名和后缀名进行文件筛选:
private boolean checkSuffix(String fileName,
String[] fileSuffix) {
for (String suffix : fileSuffix) {
if (fileName != null) {
if (fileName.toLowerCase().endsWith(suffix)) {
return true;
}
}
}
return false;
}
然后就是对目录下的所有文件,进行遍历筛选,然后保存在list中,稍后进行展示:
public List<FileInfo> getTextFilesInfo(File fileDir) {
textFilesInfo = new ArrayList<>();
textFilesInfo(fileDir);
return textFilesInfo;
}
public void textFilesInfo(File fileDir) {
File[] listFiles = fileDir.listFiles(ALL_FOLDER_AND_FILES_FILTER);
if (listFiles != null) {
for (File file : listFiles) {
if (file.isDirectory()) {
textFilesInfo(file);
} else {
if (checkSuffix(file.getName(), FileManagerContext.getInstance().getResources().getStringArray(R.array.rc_file_file_suffix))) {
FileInfo fileInfo = getFileInfoFromFile(file);
textFilesInfo.add(fileInfo);
}
}
}
}
}
好啦,文件管理器的实现就先讲到这里,文件管理的源码我已经上传到github上了,需要的童鞋可以去下载那!
###地址:https://github.com/TinkerTi/FileManager