文件管理器思路:
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());
}
}
}
效果图:
测试可用!!!