文件管理器

文件管理器思路:

1、使用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 判断是否存在SD卡;

2、如果存在SD卡,使用Environment.getExternalStorageDirectory(); 获取SD卡根目录,并使用 listFiles() 获取根目录下面所有的文件以及文件夹存放在一个数组中,再讲它们适配到ListView。

3、判断ListView里面的所有文件是不是文件夹,如果是文件夹,就使用 listFiles()  获取该文件夹下面所有的文件以及文件夹;如果是文件,单击时弹出操作对话框。

安卓文件管理器:(省略了xml文件,主要的布局文件就是一个ListView,还有几个自定义的对话框,用来修改文件名以及创建新文件夹等功能。)

代码:

package com.mfc.contractactivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
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.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.myapp.R;

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

public class FileMessageActivity extends AppCompatActivity {
    //定义界面组件
    private ListView listView;
    private TextView title;
    private ImageView addContract;  //返回上一级

    //父文件夹
    File parent;
    //父文件夹下的所有子文件夹和文件
    File[] son;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_message);
        //初始化组件
        title = (TextView) findViewById(R.id.title);
        listView = (ListView) findViewById(R.id.listView);
        addContract = (ImageView) findViewById(R.id.addContract);
        addContract.setImageResource(R.drawable.ic_menu_camera);
        title.setText("文件管理器");

        File root = null;
        //判断是否存在SD卡
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            //获取SD卡目录
            root = Environment.getExternalStorageDirectory();
            //将SD卡目录赋给父文件夹
            parent = root;
            //查询出本文件夹下所有的文件以及文件夹,填充Listview
            son = parent.listFiles();
            fillListView(son);
        }
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent1, View view, int position, long id) {
                if(son[position].isFile()){
                    fileHandle(son[position]);
                    return ;
                }else{
                    if(son[position].listFiles() == null || son[position].listFiles().length == 0){
                        Toast.makeText(FileMessageActivity.this, "本文件夹是空的或者无权访问", Toast.LENGTH_LONG).show();
                    }else{
                        //将当前文件夹作为父文件夹
                        parent = son[position];
                        //获取这个文件夹下所有的文件以及文件夹
                        son = parent.listFiles();
                        //更新listview
                        fillListView(son);
                    }
                }
            }
        });

        addContract.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if(!parent.getCanonicalPath().equals("/")){
                        //获取上一级的文件夹
                        parent=parent.getParentFile();
                        //获取上一级文件夹下所有的文件
                        son=parent.listFiles();
                        fillListView(son);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    //填充listview
    private void fillListView(File[] files){
        //创建一个List集合,集合里面存放map
        List<Map<String , Object>> list = new ArrayList<Map<String , Object>>();
        for (int i = 0; i < files.length; i++){
            Map<String , Object> map = new HashMap<String ,Object>();
            if(files[i].isFile()){
                map.put("icon",R.drawable.file);
            }else{
                map.put("icon",R.drawable.folder);
            }
            map.put("filename",files[i].getName());
            list.add(map);
        }
        SimpleAdapter simpleAdapter = new SimpleAdapter(FileMessageActivity.this,
                list,R.layout.line,new String[]{"icon","filename"},new int[]{R.id.icon,R.id.filename});
        listView.setAdapter(simpleAdapter);
    }

    //打开文件
    private void openFile(File file){
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(android.content.Intent.ACTION_VIEW);
        String type  =getMIMEType(file);
        intent.setDataAndType(Uri.fromFile(file),type);
        startActivity(intent);
    }

    //获取文件mimetype
    private String getMIMEType(File file){
        String type = "";
        String name = file.getName();
        //文件扩展名
        String end = name.substring(name.lastIndexOf(".")+1,name.length()).toLowerCase();
        if (end.equals("m4a") || end.equals("mp3") || end.equals("wav")) {
            type = "audio";
        } else if (end.equals("mp4") || end.equals("3gp")) {
            type = "video";
        } else if (end.equals("jpg") || end.equals("png") || end.equals("jpeg") || end.equals("bmp") || end.equals("gif")) {
            type = "image";
        } else {
            //如果无法直接打开,跳出列表由用户选择
            type = "*";
        }
        type += "/*";
        return type;
    }

    //对文件进行增删改
    private void fileHandle(final File file){
        final String[] items = {"打开文件","删除文件","重命名"};
        AlertDialog alertDialog = new AlertDialog.Builder(FileMessageActivity.this)
                .setTitle("请选择")
                .setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (items[which].equals("打开文件")){
                            openFile(file);
                        }else if(items[which].equals("删除文件")){
                            AlertDialog alertDialog1 = new AlertDialog.Builder(FileMessageActivity.this)
                                    .setTitle("注意!")
                                    .setMessage("确定要删除此文件吗?")
                                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            if (file.delete()) {
                                                //更新文件列表
                                                fillListView(parent.listFiles());
                                                Toast.makeText(FileMessageActivity.this,"删除成功!",Toast.LENGTH_LONG).show();
                                            } else {
                                                Toast.makeText(FileMessageActivity.this,"删除失败!",Toast.LENGTH_LONG).show();
                                            }
                                        }
                                    })
                                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                        }
                                    }).show();
                        }else{
                            Toast.makeText(FileMessageActivity.this,"点击了重命名!",Toast.LENGTH_LONG).show();
                            //重命名
                            LayoutInflater factory = LayoutInflater.from(FileMessageActivity.this);
                            final View view = factory.inflate(R.layout.rename_dialog, null);
                            final EditText rename = (EditText) view.findViewById(R.id.rename);
                            rename.setText(file.getName());
                            AlertDialog alertDialog1 = new AlertDialog.Builder(FileMessageActivity.this)
                                    .setTitle("填写新文件名")
                                    .setView(view)
                                    .setPositiveButton("修改", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            final String  newName = rename.getText().toString().trim();
                                            final String fpath = file.getParentFile().getPath();
                                            final File newFile = new File(fpath + "/" + newName);
                                            if (newFile.exists()){
                                                //排除没有修改的情况
                                                if(!newName.equals(file.getName())){
                                                    AlertDialog alertDialog1 = new AlertDialog.Builder(FileMessageActivity.this)
                                                            .setTitle("注意!")
                                                            .setMessage("文件名已存在,是否覆盖?")
                                                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                                                @Override
                                                                public void onClick(DialogInterface dialog, int which) {
                                                                    if (file.renameTo(newFile)){
                                                                        fillListView(parent.listFiles());
                                                                        Toast.makeText(FileMessageActivity.this,"重命名成功!",Toast.LENGTH_LONG).show();
                                                                    }else{
                                                                        Toast.makeText(FileMessageActivity.this,"重命名失败!",Toast.LENGTH_LONG).show();
                                                                    }
                                                                }
                                                            })
                                                            .setNegativeButton("取消",null)
                                                            .show();
                                                }
                                            }else{
                                                if (file.renameTo(newFile)) {
                                                    fillListView(parent.listFiles());
                                                    Toast.makeText(FileMessageActivity.this,"重命名成功!",Toast.LENGTH_LONG).show();
                                                } else {
                                                    Toast.makeText(FileMessageActivity.this,"重命名失败!",Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }
                                    })
                                    .show();
                        }
                    }
                })
                .show();
    }

    //添加菜单
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, 1, 1, "新建")
                .setIcon(android.R.drawable.ic_menu_send);
        menu.add(Menu.NONE, 2, 2, "取消")
                .setIcon(android.R.drawable.ic_menu_edit);
        return true;
    }

    //对菜单选项进行操作
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1:{
                final EditText editText = new EditText(FileMessageActivity.this);
                new AlertDialog.Builder(FileMessageActivity.this).setTitle("请输入文件名称").setView(editText).setPositiveButton("确定",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                String mFileName = editText.getText().toString();
                                String IMAGES_PATH = Environment.getExternalStorageDirectory() + "/" + mFileName + "/";       //获取根目录
                                createMkdir(IMAGES_PATH);
                            }
                        }).setNegativeButton("取消", null).show();
            }
            break;
            case 2:
                Toast.makeText(this, "取消", Toast.LENGTH_LONG).show();
                break;
        }
        return false;
    }

    //新建文件
    public void createMkdir(String folderPath) {
        File folder = new File(folderPath);
        if (!folder.exists()) {
            folder.mkdir();
            fillListView(parent.listFiles());
        }
    }
}

效果图:



测试可用!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值