Android文件管理器

##一、首先看效果

文件管理的操作界面
文件内部存储卡中的文件
文件外部存储卡文件(SD卡)

##二、文件管理器的界面
###有两大块部分:
####这第一部分是分类查找:
按照文件类型进行分类,代码逻辑是按照常见的文件后缀名对文件进行分类,主要是文本、视频、音频三大类,其他的文件类型都放在了最后一栏中;
####第二部分是按照文件目录,逐级地浏览文件:
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

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值