Android文件管理器FileManager

读取存储空间下的文件并以ListView的形式显示出来。

package com.zms.filemanager;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main extends Activity implements AdapterView.OnItemClickListener,
        AdapterView.OnItemLongClickListener {

    private ListView fileView;
    private String path = "/sdcard";// 文件路径
    private List<Map<String, Object>> items;
    private SimpleAdapter adapter;
    private File backFile = null;
    private String currentPath = "/sdcard";
    private boolean flag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setTitle("文件管理");
        fileView = (ListView) findViewById(R.id.filelist);
        listDir(path);
    }

    /**
     * 动态绑定文件信息到listview上
     *
     * @param path
     */
    private void listDir(String path) {
        items = bindList(path);

        // if(items!=null){
        adapter = new SimpleAdapter(this, items, R.layout.file_row,
                new String[]{"name", "path", "img"}, new int[]{R.id.name,
                R.id.desc, R.id.img});
        fileView.setAdapter(adapter);
        fileView.setOnItemClickListener(this);
        fileView.setOnItemLongClickListener(this);
        fileView.setSelection(0);
        // }
    }

    /**
     * 返回所有文件目录信息
     *
     * @param path
     * @return
     */
    private List<Map<String, Object>> bindList(String path) {
        File[] files = new File(path).listFiles();
        // if(files!=null){
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(
                files.length);
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("name", "/sdcard");
        root.put("img", R.drawable.folder);
        root.put("path", "根目录");
        list.add(root);
        Map<String, Object> pmap = new HashMap<String, Object>();
        pmap.put("name", "返回");
        pmap.put("img", R.drawable.back);
        pmap.put("path", "上级目录");
        list.add(pmap);
        for (File file : files) {
            Map<String, Object> map = new HashMap<String, Object>();
            if (file.isDirectory()) {
                map.put("img", R.drawable.folder);
            } else {
                map.put("img", R.drawable.doc);
            }
            map.put("name", file.getName());
            map.put("path", file.getPath());
            list.add(map);
        }
        return list;
        /*
         * } return null;
		 */
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                            long arg3) {

        if (position == 0) {// 返回到/sdcard目录
            path = "/sdcard";
            listDir(path);
        } else if (position == 1) {// 返回上一级目录
            toParent();
        } else {
            if (items != null) {
                path = (String) items.get(position).get("path");
                File file = new File(path);
                if (file.canRead() && file.canExecute() && file.isDirectory()) {
                    listDir(path);
                } else {
                    openFile(file);
                    Toast.makeText(this, "呵呵", Toast.LENGTH_SHORT).show();
                }
            }
        }
        backFile = new File(path);
    }

    private void toParent() {// 回到父目录
        File file = new File(path);
        File parent = file.getParentFile();
        if (parent == null) {
            listDir(path);
        } else {
            path = parent.getAbsolutePath();
            listDir(path);
        }
    }

    /**
     * 文件操作提示
     *
     * @param id
     */
    private void myNewDialog(int id) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        switch (id) {
            case 0:
                LayoutInflater factory = LayoutInflater.from(this);
                final View textEntryView = factory.inflate(R.layout.filedialog,
                        null);
                builder.setTitle("创建文件夹");
                builder.setView(textEntryView);
                builder.setPositiveButton("确定", new CreateDialog(textEntryView));
                builder.setNegativeButton("取消", null);
                break;
            case 1:
                LayoutInflater factory2 = LayoutInflater.from(this);
                final View textEntryView2 = factory2.inflate(R.layout.filedialog,
                        null);
                builder.setTitle("重命名文件");
                builder.setView(textEntryView2);
                builder.setPositiveButton("确定", new RenameDialog(textEntryView2));
                // <span
                // style="font-family:Arial,Helvetica,sans-serif;">builder.setNegativeButton("取消",
                // null);</span>
                builder.setNegativeButton("取消", null);
                break;
            case 2:
                builder.setTitle("确定要删除吗?");
                builder.setPositiveButton("确定", new DeleteDialog());
                builder.setNegativeButton("取消", null);
                break;
        }
        builder.create().show();
    }

    private void mySortDialog(int id) { // 排序

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        switch (id) {
            case 0:// 按名称排序
                LayoutInflater factory = LayoutInflater.from(this);
                final View textEntryView = factory.inflate(R.layout.filedialog,
                        null);
                builder.setTitle("创建文件夹");
                builder.setView(textEntryView);
                builder.setPositiveButton("确定", new CreateDialog(textEntryView));
                builder.setNegativeButton("取消", null);
                break;
            case 1:// 按时间排序
                LayoutInflater factory2 = LayoutInflater.from(this);
                final View textEntryView2 = factory2.inflate(R.layout.filedialog,
                        null);
                builder.setTitle("重命名文件");
                builder.setView(textEntryView2);
                builder.setPositiveButton("确定", new RenameDialog(textEntryView2));
                // <span
                // style="font-family:Arial,Helvetica,sans-serif;">builder.setNegativeButton("取消",
                // null);</span>
                builder.setNegativeButton("取消", null);
                break;
            case 2:
                builder.setTitle("确定要删除吗?");
                builder.setPositiveButton("确定", new DeleteDialog());
                builder.setNegativeButton("取消", null);
                break;
        }
        builder.create().show();
    }

    /**
     * 根据路径删除指定的目录或文件,无论存在与否
     *
     * @param sPath 要删除的目录或文件
     * @return 删除成功返回 true,否则返回 false。
     */
    public boolean DeleteFolder(String sPath) {
        flag = false;
        File file = new File(sPath);
        // 判断目录或文件是否存在
        if (!file.exists()) { // 不存在返回 false
            return flag;
        } else {
            // 判断是否为文件
            if (file.isFile()) { // 为文件时调用删除文件方法
                return deleteFile(sPath);
            } else { // 为目录时调用删除目录方法
                return deleteDirectory(sPath);
            }
        }
    }

    /**
     * 删除单个文件
     *
     * @param sPath 被删除文件的文件名
     * @return 单个文件删除成功返回true,否则返回false
     */
    public boolean deleteFile(String sPath) {
        flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录(文件夹)以及目录下的文件
     *
     * @param sPath 被删除目录的文件路径
     * @return 目录删除成功返回true,否则返回false
     */
    public boolean deleteDirectory(String sPath) {
        // 如果sPath不以文件分隔符结尾,自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        // 如果dir对应的文件不存在,或者不是一个目录,则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        flag = true;
        // 删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            } // 删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag)
            return false;
        // 删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 文件刷新
     *
     * @param file
     */
    private void fileScan(String file) {
        Uri data = Uri.parse("file://" + file);

        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
    }

    /**
     * 启动文件打开
     *
     * @param f
     */
    private void openFile(File f) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(android.content.Intent.ACTION_VIEW);

        // 获取文件媒体类型
        String type = getMIMEType(f);
        if (type == null)
            return;
        intent.setDataAndType(Uri.fromFile(f), type);
        startActivity(intent);
    }

    // add for test start
    private final String[][] MIME_MapTable = {
            // {后缀名, MIME类型}
            {".bin", "application/octet-stream"}, {".bmp", "image/bmp"},
            {".exe", "application/octet-stream"}, {".gif", "image/gif"},
            {".gtar", "application/x-gtar"},
            {".js", "application/x-javascript"},
            {".m3u", "audio/x-mpegurl"}, {".m4a", "audio/mp4a-latm"},
            {".m4b", "audio/mp4a-latm"}, {".m4p", "audio/mp4a-latm"},
            {".m4u", "video/vnd.mpegurl"}, {".m4v", "video/x-m4v"},
            {".mov", "video/quicktime"},
            {".mpc", "application/vnd.mpohun.certificate"},
            {".msg", "application/vnd.ms-outlook"},
            {".rtf", "application/rtf"}, {".wma", "audio/x-ms-wma"},
            {".wmv", "audio/x-ms-wmv"}};

    // add for test end

    // 获取文件类型
    private String getMIMEType(File file) {
        String type = "";
        String fileName = file.getName();
        String end = fileName.substring(fileName.indexOf(".") + 1)
                .toLowerCase();
        // 判断文件类型
        // 文档文件Text
        if (end.equals("xml") || end.equals("text") || end.equals("h")
                || end.equals("sh") || end.equals("rc") || end.equals("java")
                || end.equals("c") || end.equals("cpp") || end.equals("conf")
                || end.equals("prop") || end.equals("log"))
            type = "text/plain";
        else if (end.equals("htm") || end.equals("html"))
            type = "text/html";
            // 视频文件Video
        else if (end.equals("mpe") || end.equals("mpg") || end.equals("mpeg"))
            type = "video/mpeg";
        else if (end.equals("3gp"))
            type = "video/3gpp";
        else if (end.equals("mp4") || end.equals("mpeg4"))
            type = "video/mp4";
        else if (end.equals("avi"))
            type = "video/x-msvideo";
        else if (end.equals("asf"))
            type = "video/x-ms-asf";
            // 音频文件Audio
        else if (end.equals("mp2") || end.equals("mp3"))
            type = "audio/x-mpeg";
        else if (end.equals("wav"))
            type = "audio/x-wav";
        else if (end.equals("rmvb"))
            type = "audio/x-pn-realaudio";
        else if (end.equals("ogg"))
            type = "audio/ogg";
        else if (end.equals("mpga"))
            type = "audio/mpeg";

            // 图片文件
        else if (end.equals("png"))
            type = "image/png";
        else if (end.equals("jpg") || end.equals("jpeg"))
            type = "image/jpeg";
            // 扩展文件Application
        else if (end.equals("ppt") || end.equals("pps"))
            type = "application/vnd.ms-powerpoint";
        else if (end.equals("doc"))
            type = "application/msword";
        else if (end.equals("wps"))
            type = "application/vnd.ms-works";
        else if (end.equals("apk"))
            type = "application/vnd.android.package-archive";
        else if (end.equals("pdf"))
            type = "application/pdf";
        else if (end.equals("rar"))
            type = "application/x-rar-compressed";
        else if (end.equals("tgz") || end.equals("z"))
            type = "application/x-compressed";
        else if (end.equals("tar"))
            type = "application/x-tar";
        else if (end.equals("zip"))
            type = "application/zip";
        else if (end.equals("gz"))
            type = "application/x-gzip";
        else if (end.equals("jar"))
            type = "application/java-archive";
        else if (end.equals("bin") || end.equals("exe"))
            type = "application/octet-stream";
            // 未知文件
        else if (end.equals(""))
            type = "*/*";
        /*
		 * if (end.equals("wma") || end.equals("mp3") || end.equals("midi") ||
		 * end.equals("ape") || end.equals("amr") || end.equals("ogg") ||
		 * end.equals("wav") || end.equals("acc")) { type = "audio"; } else if
		 * (end.equals("3gp") || end.equals("mp4") || end.equals("rmvb") ||
		 * end.equals("flv") || end.equals("avi") || end.equals("wmv") ||
		 * end.equals("f4v")) { type = "video"; } else if (end.equals("jpg") ||
		 * end.equals("gif") || end.equals("png") || end.equals("jpeg") ||
		 * end.equals("bmp")) { type = "image"; } //add for doc start else
		 * if(end
		 * .equals("txt")||end.equals("cpp")||end.equals("c")||end.equals("java"
		 * )||end.equals("prop")){ type = "text"; } //add for doc end else {
		 * Toast.makeText(getApplicationContext(), "未知文件类型", Toast.LENGTH_LONG)
		 * .show(); return null; }
		 */
        // MIME Type格式是"文件类型/文件扩展名"
        type += "/*";
        return type;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        menu.add(0, Menu.FIRST, 0, "新建");
        menu.add(0, Menu.FIRST + 1, 0, "关于");
        menu.add(0, Menu.FIRST + 2, 0, "排序");
        menu.add(0, Menu.FIRST + 3, 0, "退出");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1: // 新建(文件夹)
                myNewDialog(0);
                break;
            case 2: // 关于
                Toast.makeText(this, "[email protected] 2014", Toast.LENGTH_SHORT)
                        .show();
                break;
            case 3: // 排序
                mySortDialog(0);
                break;
            case 4: // 退出应用
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                android.os.Process.killProcess(android.os.Process.myPid());
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
                                   long arg3) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        String[] items = {"重命名", "删除"};

        builder.setItems(items, new LongDialog(arg2));
        builder.create().show();
        return true;
    }

    class CreateDialog implements DialogInterface.OnClickListener {

        private View textEntryView;

        public CreateDialog(View textEntryView) {
            this.textEntryView = textEntryView;
        }

        @Override
        public void onClick(DialogInterface dialog, int which) {

            // EditText userName = (EditText) textEntryView
            // .findViewById(R.id.fname);
            EditText userName = (EditText) textEntryView
                    .findViewById(R.id.fname);
            String fn = userName.getText().toString().trim();

            if (!TextUtils.isEmpty(fn)) {
                File file = new File(backFile, fn);
                if (file.exists()) {
                    Toast.makeText(Main.this, "文件夹已存在", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    if (file.mkdir()) {
                        Toast.makeText(Main.this, "创建成功!", Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        Toast.makeText(Main.this, "创建失败!", Toast.LENGTH_SHORT)
                                .show();
                    }
                    listDir(file.getAbsolutePath());
                    // fileScan(f.getAbsolutePath());
                    adapter.notifyDataSetChanged();
                }
            }
        }
    }

    class RenameDialog implements DialogInterface.OnClickListener {
        private View textEntryView2;

        public RenameDialog(View textEntryView2) {
            this.textEntryView2 = textEntryView2;
        }

        @Override
        public void onClick(DialogInterface dialog, int which) {
            EditText userName = (EditText) textEntryView2
                    .findViewById(R.id.fname);
            String fn = userName.getText().toString().trim();
            if (!TextUtils.isEmpty(fn)) {
                File old = new File(currentPath);
                File f = new File(backFile.getAbsolutePath(), fn);
                if (f.exists()) {
                    Toast.makeText(Main.this, "文件已存在", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(Main.this, "文件重命名 " + old.renameTo(f), Toast.LENGTH_SHORT)
                            .show();
                    listDir(f.getAbsolutePath());
                    // fileScan(f.getAbsolutePath());
                    adapter.notifyDataSetChanged();
                }
            }
        }
    }

    class DeleteDialog implements DialogInterface.OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            File file = new File(currentPath);
            if (file.exists()) {
                DeleteFolder(file.getAbsolutePath());
                listDir(file.getParent());
                // fileScan(f.getAbsolutePath());
                adapter.notifyDataSetChanged();
            } else
                Toast.makeText(Main.this, "文件不存在!", Toast.LENGTH_SHORT).show();
        }
    }

    // 文件操作选择
    class LongDialog implements DialogInterface.OnClickListener {
        private int pos = 0;

        public LongDialog(int pos) {
            this.pos = pos;
        }

        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case 0:
                    currentPath = (String) items.get(pos).get("path");
                    myNewDialog(1);
                    break;
                case 1:
                    currentPath = (String) items.get(pos).get("path");
                    myNewDialog(2);
                    break;
            }
        }
    }

}
时间: 2024-10-09 09:17:28

Android文件管理器FileManager的相关文章

Android文件管理器项目(三)

? 一句话分享:觉得食物不好吃就不要吃,因为大脑会记住这个味道,从而让你形成习惯,越来越糟. 概述:写到这里我已经开始怀疑这个项目是不是文件管理器项目了--我只是看了看 GitHub 这个项目的主页的几张图片,貌似只是一个查看pdf和doc 文档的项目.这就是英语不好又没有去翻译的错吧.目前还剩下一个 fragment 类没有处理了.而这个没有处理的类里面的方法名我已经写出来了. 吐槽一下 : 原项目写的真是糟糕啊.全部挤在一起成一块,内部类,内部接口,这些东西还不止一个. 我一直反感这种写法,

Android 文件管理器项目(一)

? 开场白:最近领悟到不能总是学习什么小的知识点,应该全局去思考一下.所以就去找开源项目,然后找到了这个文件管理器的项目.看了源码,其实也说不上是管理吧,毕竟很简单.但好歹是一个完整的项目.界面也非常漂亮,并且没有用什么图片资源,非常适合自学. 上链接,有兴趣的同学可以去看一些,几个月前最后更新,看来修改幅度不大了. https://github.com/dibakarece/AndroidFileExplorer 今晚就写了res下面那些文件,因为在编写逻辑的时候如果资源文件夹没有的话,会非常

我的Android案例—文件管理器

2015年的Android案例之旅 案例九:文件管理器 知识点: 功能设计到手机文件.SD卡文件的增删改查功能,目前实现了增查.. JAVA中对文件的操作 Adapter的使用,无论是SimpleAdapter,还是BaseAdapter AlertDialog的使用 还有一些监听事件的使用 涉及文件: res->layout->main.xml 主界面布局文件 res->layout->item_toolbar.xml 适配器布局文件,用于菜单选项 res->layout-

XC文件管理器(Android应用)

XC文件管理器,是基于Android4.4开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建.删除.重命名.复制,移动剪切以及文件详情查看等文件和目录的功能,同时支持文件和目录的批量管理,应该功能较全,视图提供两种:网格视图以及列表视图,应用界面简洁美观,易用性强,是较好易用的一款Android文件管理应用. 下载地址:http://download.csdn.net/detail/jczmdeveloper/7364093 应用截图如下: XC文件管理器(And

发现一个好用的Android文件访问工具--es文件管理器,可以在同局域网下的浏览器中查看手机中的文件

如题,发现一个好用的Android文件访问工具--es文件管理器,可以在同局域网下的浏览器中查看手机中的文件 1.在手机上打开es文件管理器的远程管理器,如图:                   2.保证手机和电脑在同一个局域网下(有线或者Wifi都可以) 贴一下我的地址: (1)我电脑的IP地址(有线宽带连接): (2)手机的地址(Wifi): 3.在别的手机或者电脑上打开上面的Url(我的是:ftp://192.168.1.115:3721/),打开后就是这样的: 3. 看一下刚才在手机上

Android调用系统自带的文件管理器进行文件选择

http://blog.csdn.net/zqchn/article/details/8770913的补充 FileUtils文件 public class FileUtils {     public static String getPath(Context context, Uri uri) {         if ("content".equalsIgnoreCase(uri.getScheme())) {             String[] projection =

Android MediaProvider--文件管理:必现,文件管理器中新建几个文件夹,批量删除后,连接电脑查看仍有部分文件夹未删除

问题描述: [测试步骤]:1.进入文件管理器中,新建几个文件夹,然后批量全选这些文件夹--删除: 2.手机连接电脑,在电脑端查看文件显示. [测试结果]:电脑端查看仍有部分文件夹未删除.插拔USB线几次,在电脑端重新查看,仍显示. [预期结果]:电脑端不应显示已删除的文件夹. [复现概率]:100%(若第一次未复现,步骤1.2重新操作即可复现) [备注]:在文件管理中点击"搜索",也能搜索出这些文件夹. 按以下步骤更容易复现 1.添加一个本地文件夹,删除新添加的文件夹 2.再新建另一文

解决Android Studio 将String类型保存为.txt文件,按下button跳转到文件管理器(解决了保存txt文件到文件管理后,手机打开是乱码的问题)

不知道为什么保存文件后之前打开一直都OK,就突然打开看到变成乱码了,最后解决了 关键:outStream.write(finalContent.getBytes("gbk")); write的时候设置一下:转换格式(UFT-8在android不能用,只能用gbk)!!!我之前试过utf-8,还是乱码,没什么用,就是gbk! 从项目里面抽取了这个把String保存为txt到本地的方法: String sdCardDir =Environment.getExternalStorageDir

介绍分享几款免费的在线Web文件管理器

经常有朋友在使用一些没有带文件管理器的空间时,苦于没有办法来解压上传的文件压缩包,而如果不先上传压缩包,直接上传文件夹的话耗费的时间太多.还有一些朋友希望将空间变成一个文件存储站,这时就需要一个功能足够多也足够强大的在线文件管理器了. 在线的Web文件管理器非常地多,尤其是以PHP在线文件管理器最多,但是真正能够满足我们的文件管理需求同时也容易安装和使用的Web文件管理器不是很多.本篇文章部落就精选四个界面友好.功能丰富和安装方便的Web文件管理器:net2ftp.Pydio.eXtplorer