一个简易的文件管理器
来源:互联网 发布:游戏源码是什么 编辑:程序博客网 时间:2024/05/18 06:27
本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下:
这里运用Java I/O、ListView、Dialog、Bitmap等实现简单文件管理器,可以查看目录,文件大小,创建时间,修改文件名,删除文件,打开文件。比较简单,直接看代码:
先看布局文件:layout/activty_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/path"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:textSize="18sp"
android:textColor="@android:color/holo_blue_bright"/>
<TextView
android:id="@+id/item_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@android:color/holo_green_dark"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dip"
android:background="#09c"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fadingEdge="none"
android:cacheColorHint="@android:color/transparent"/>
</LinearLayout>
</LinearLayout>
文件列表布局:
layout/file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center_vertical"
android:textSize="18sp">
</TextView>
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:textSize="18sp" />
</LinearLayout>
<TextView
android:id="@+id/tv_time"
android:layout_gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:textSize="18sp" />
</LinearLayout>
修改文件名对话框布局文件:layout/rename_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
主Activity:
package cn.beiquan.filemanager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private static final String ROOT_PATH = "/";
//存储文件名称
private ArrayList<String> names = null;
//存储文件路径
private ArrayList<String> paths = null;
private View view;
private EditText editText;
private ListView mList;
private TextView mPathView;
private TextView mItemCount;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList = (ListView) findViewById(R.id.list);
mPathView = (TextView) findViewById(R.id.path);
mItemCount = (TextView) findViewById(R.id.item_count);
//显示文件列表
showFileDir(ROOT_PATH);
}
private void showFileDir(String path){
names = new ArrayList<String>();
paths = new ArrayList<String>();
File file = new File(path);
//显示文件路径
mPathView.setText(file.getAbsolutePath());
File[] files = file.listFiles();
//显示当前文件夹下
mItemCount.setText(files.length + "项");
//如果当前目录不是根目录
if (!ROOT_PATH.equals(path)){
//根目录
names.add("@1");
paths.add(ROOT_PATH);
//上一级
names.add("@2");
paths.add(file.getParent());
}
//添加所有文件
for (File f : files){
names.add(f.getName());
paths.add(f.getPath());
}
mList.setAdapter(new MyAdapter(this,names, paths));
mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String path = paths.get(i);
File file = new File(path);
// 文件存在并可读
if (file.exists() && file.canRead()){
if (file.isDirectory()){
//显示子目录及文件
showFileDir(path);
}
else{
//处理文件
fileHandle(file);
}
}
//没有权限
else{
Resources res = getResources();
new AlertDialog.Builder(MainActivity.this).setTitle("Message")
.setMessage(res.getString(R.string.no_permission))
.setPositiveButton("OK",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
}
});
}
//对文件进行增删改
private void fileHandle(final File file){
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {
// 打开文件
if (which == 0){
openFile(file);
}
//修改文件名
else if(which == 1){
LayoutInflater factory = LayoutInflater.from(MainActivity.this);
view = factory.inflate(R.layout.rename_dialog, null);
editText = (EditText)view.findViewById(R.id.editText);
editText.setText(file.getName());
DialogInterface.OnClickListener listener2 = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String modifyName = editText.getText().toString();
final String fpath = file.getParentFile().getPath();
final File newFile = new File(fpath + "/" + modifyName);
if (newFile.exists()){
//排除没有修改情况
if (!modifyName.equals(file.getName())){
new AlertDialog.Builder(MainActivity.this)
.setTitle("注意!")
.setMessage("文件名已存在,是否覆盖?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (file.renameTo(newFile)){
showFileDir(fpath);
displayToast("重命名成功!");
}
else{
displayToast("重命名失败!");
}
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
}
else{
if (file.renameTo(newFile)){
showFileDir(fpath);
displayToast("重命名成功!");
}
else{
displayToast("重命名失败!");
}
}
}
};
AlertDialog renameDialog = new AlertDialog.Builder(MainActivity.this).setView(view).setPositiveButton("确定",listener2).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialog.dismiss();
}
}).create();
renameDialog.show();
}
//删除文件
else{
new AlertDialog.Builder(MainActivity.this)
.setTitle("注意!")
.setMessage("确定要删除此文件吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(file.delete()){
//更新文件列表
showFileDir(file.getParent());
displayToast("删除成功!");
}
else{
displayToast("删除失败!");
}
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
}
};
//选择文件时,弹出增删该操作选项对话框
String[] menu = {"打开文件","重命名","删除文件"};
new AlertDialog.Builder(MainActivity.this)
.setTitle("请选择要进行的操作!")
.setItems(menu, listener)
.setPositiveButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
//打开文件
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 fileName = file.getName();
int dotIndex = fileName.indexOf('.');
if(dotIndex < 0) {
return type;
}
String end = fileName.substring(dotIndex, fileName.length()).toLowerCase();
if(end == "") {
return type;
}
for(int i=0; i<MIME_MapTable.length; i++) {
if(end.equals(MIME_MapTable[i][0])) {
type = MIME_MapTable[i][1] ;
}
}
return type;
}
private final String[][] MIME_MapTable = {
// {后缀名, MIME类型}
{ ".3gp", "video/3gpp" },
{ ".apk", "application/vnd.android.package-archive" },
{ ".asf", "video/x-ms-asf" },
{ ".avi", "video/x-msvideo" },
{ ".bin", "application/octet-stream" },
{ ".bmp", "image/bmp" },
{ ".c", "text/plain" },
{ ".class", "application/octet-stream" },
{ ".conf", "text/plain" },
{ ".cpp", "text/plain" },
{ ".doc", "application/msword" },
{ ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
{ ".xls", "application/vnd.ms-excel" },
{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
{ ".exe", "application/octet-stream" },
{ ".gif", "image/gif" },
{ ".gtar", "application/x-gtar" },
{ ".gz", "application/x-gzip" },
{ ".h", "text/plain" },
{ ".htm", "text/html" },
{ ".html", "text/html" },
{ ".jar", "application/java-archive" },
{ ".java", "text/plain" },
{ ".jpeg", "image/jpeg" },
{ ".jpg", "image/jpeg" },
{ ".js", "application/x-javascript" },
{ ".log", "text/plain" },
{ ".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" },
{ ".mp2", "audio/x-mpeg" },
{ ".mp3", "audio/x-mpeg" },
{ ".mp4", "video/mp4" },
{ ".mpc", "application/vnd.mpohun.certificate" },
{ ".mpe", "video/mpeg" },
{ ".mpeg", "video/mpeg" },
{ ".mpg", "video/mpeg" },
{ ".mpg4", "video/mp4" },
{ ".mpga", "audio/mpeg" },
{ ".msg", "application/vnd.ms-outlook" },
{ ".ogg", "audio/ogg" },
{ ".pdf", "application/pdf" },
{ ".png", "image/png" },
{ ".pps", "application/vnd.ms-powerpoint" },
{ ".ppt", "application/vnd.ms-powerpoint" },
{ ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
{ ".prop", "text/plain" },
{ ".rc", "text/plain" },
{ ".rmvb", "audio/x-pn-realaudio" },
{ ".rtf", "application/rtf" },
{ ".sh", "text/plain" },
{ ".tar", "application/x-tar" },
{ ".tgz", "application/x-compressed" },
{ ".txt", "text/plain" },
{ ".wav", "audio/x-wav" },
{ ".wma", "audio/x-ms-wma" },
{ ".wmv", "audio/x-ms-wmv" },
{ ".wps", "application/vnd.ms-works" },
{ ".xml", "text/plain" },
{ ".z", "application/x-compress" },
{ ".zip", "application/x-zip-compressed" },
{ "", "*/*" }
};
private void displayToast(String message){
Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
}
}
自定义适配器:
public class MyAdapter extends BaseAdapter {
private LayoutInflater inflater;
private Bitmap directory, file;
//存储文件名称
private ArrayList<String> names = null;
//存储文件路径
private ArrayList<String> paths = null;
//参数初始化
public MyAdapter(Context context, ArrayList<String> na, ArrayList<String> pa) {
names = na;
paths = pa;
directory = BitmapFactory.decodeResource(context.getResources(), R.drawable.dir);
file = BitmapFactory.decodeResource(context.getResources(), R.drawable.file);
//缩小图片
directory = small(directory, 0.16f);
file = small(file, 0.1f);
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return names.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return names.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (null == convertView) {
convertView = inflater.inflate(R.layout.file, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.tv_name);
holder.image = (ImageView) convertView.findViewById(R.id.iv_icon);
holder.size = (TextView) convertView.findViewById(R.id.tv_size);
holder.time = (TextView) convertView.findViewById(R.id.tv_time);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
File f = new File(paths.get(position).toString());
if (names.get(position).equals("@1")) {
holder.text.setText("/");
holder.image.setImageBitmap(directory);
} else if (names.get(position).equals("@2")) {
holder.text.setText("..");
holder.image.setImageBitmap(directory);
} else {
holder.text.setText(f.getName());
holder.time.setText(new SimpleDateFormat("yyyy/MM/dd").format(f.lastModified()));
if (f.isDirectory()) {
holder.image.setImageBitmap(directory);
holder.size.setVisibility(View.GONE);
} else if (f.isFile()) {
holder.size.setVisibility(View.VISIBLE);
holder.image.setImageBitmap(file);
holder.size.setText(getDataSize(f.length()));
} else {
System.out.println(f.getName());
}
}
return convertView;
}
private class ViewHolder {
private TextView text;//文件名称
private ImageView image;//icon
private TextView size;//文件大小
private TextView time;//文件创建的时间
}
private Bitmap small(Bitmap map, float num) {
Matrix matrix = new Matrix();
matrix.postScale(num, num);
return Bitmap.createBitmap(map, 0, 0, map.getWidth(), map.getHeight(), matrix, true);
}
/**
* 返回byte的数据大小对应的文本
*
* @param size
* @return
*/
public static String getDataSize(long size) {
DecimalFormat formater = new DecimalFormat("####.00");
if (size < 1024) {
return size + "B";
} else if (size < 1024 * 1024) {
float kbsize = size / 1024f;
return formater.format(kbsize) + "KB";
} else if (size < 1024 * 1024 * 1024) {
float mbsize = size / 1024f / 1024f;
return formater.format(mbsize) + "MB";
} else if (size < 1024 * 1024 * 1024 * 1024) {
float gbsize = size / 1024f / 1024f / 1024f;
return formater.format(gbsize) + "GB";
} else {
return "size: error";
}
}
}
因为要对文件进行操作,所以在描述文件中授权:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.beiquan.filemanager">
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".FileManagerActivity"></activity>
</application>
</manifest>
- 一个简易的文件管理器
- ASP.Net做的简易版文件管理器,就一个aspx文件的版本
- Android简易文件管理器的用法
- android简易文件管理器的用法
- android简易文件管理器的用法
- 简易文件管理器
- android简易文件管理器
- 简易文件管理器实现
- 简易文件管理器
- 一个简单的文件管理器
- ListView制作简易文件管理器
- 简易文件管理器(未完成)
- Androin学习笔记四十七:简易文件管理器的用法
- 一个文件读写的简易例子
- 一个简易的文件搜索器
- 【android】简易文件管理器(列表式文件目录)
- 一个私人定制的PC端Android文件管理器
- C#——一个简单的文件管理器
- js本地储存Cookie和Session简单对比
- 强弟弟胡牌算法python版本
- Python Fileinput 模块
- Linux中断和异常
- js本地储存方式有那些各种储存方案
- 一个简易的文件管理器
- java子线程访问网络
- Android WebView和Native交互的3种方式总结
- cordova 安卓 android 物理 返回键 监听和处理
- 入职培训记录与心得
- java对数组进行排序
- 对象和引用
- 体脂肪丰乳注意事项
- iOS开发之高级视图—— UITableView(一)简单例子