这里运用Java I/O、ListActivity、Dialog、Bitmap等实现简单文件管理器,可以查看目录文件,修改文件名,删除文件,打开文件。比较简单,直接看代码:
先看布局文件:
layout/main.xml
01 | <?xml version= "1.0" encoding= "utf-8" ?> |
02 | <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" |
03 | android:orientation= "vertical" |
04 | android:layout_width= "fill_parent" |
05 | android:layout_height= "fill_parent" |
06 | > |
07 | <ListView |
08 | android:id= "@android:id/list" |
09 | android:layout_width= "wrap_content" |
10 | android:layout_height= "wrap_content" |
11 | /> |
12 | </LinearLayout> |
文件列表布局:
layout/file.xml
01 | <?xml version= "1.0" encoding= "utf-8" ?> |
02 | <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" |
03 | android:orientation= "horizontal" |
04 | android:layout_width= "fill_parent" |
05 | android:layout_height= "fill_parent" |
06 | > |
07 | <ImageView |
08 | android:id= "@+id/imageView" |
09 | android:layout_width= "wrap_content" |
10 | android:layout_height= "wrap_content" |
11 | /> |
12 | <TextView |
13 | android:id= "@+id/textView" |
14 | android:layout_width= "wrap_content" |
15 | android:layout_height= "wrap_content" |
16 | android:textSize= "14sp" > |
17 | </TextView> |
18 | </LinearLayout> |
修改文件名对话框布局文件:
layout/rename_dialog.xml
01 | <?xml version= "1.0" encoding= "utf-8" ?> |
02 | <LinearLayout |
03 | xmlns:android= "http://schemas.android.com/apk/res/android" |
04 | android:layout_width= "match_parent" |
05 | android:layout_height= "match_parent" > |
06 | <EditText |
07 | android:id= "@+id/editText" |
08 | android:layout_width= "match_parent" |
09 | android:layout_height= "wrap_content" |
10 | /> |
11 | </LinearLayout> |
主Activity:
001 | public class MainActivity extends ListActivity { |
002 | private static final String ROOT_PATH = "/" ; |
003 | //存储文件名称 |
004 | private ArrayList<String> names = null ; |
005 | //存储文件路径 |
006 | private ArrayList<String> paths = null ; |
007 | private View view; |
008 | private EditText editText; |
009 | /** Called when the activity is first created. */ |
010 | @Override |
011 | public void onCreate(Bundle savedInstanceState) { |
012 | super .onCreate(savedInstanceState); |
013 | setContentView(R.layout.main); |
014 | //显示文件列表 |
015 | showFileDir(ROOT_PATH); |
016 | } |
017 | private void showFileDir(String path){ |
018 | names = new ArrayList<String>(); |
019 | paths = new ArrayList<String>(); |
020 | File file = new File(path); |
021 | File[] files = file.listFiles(); |
022 | |
023 | //如果当前目录不是根目录 |
024 | if (!ROOT_PATH.equals(path)){ |
025 | names.add( "@1" ); |
026 | paths.add(ROOT_PATH); |
027 | |
028 | names.add( "@2" ); |
029 | paths.add(file.getParent()); |
030 | } |
031 | //添加所有文件 |
032 | for (File f : files){ |
033 | names.add(f.getName()); |
034 | paths.add(f.getPath()); |
035 | } |
036 | this .setListAdapter( new MyAdapter( this ,names, paths)); |
037 | } |
038 | @Override |
039 | protected void onListItemClick(ListView l, View v, int position, long id) { |
040 | String path = paths.get(position); |
041 | File file = new File(path); |
042 | // 文件存在并可读 |
043 | if (file.exists() && file.canRead()){ |
044 | if (file.isDirectory()){ |
045 | //显示子目录及文件 |
046 | showFileDir(path); |
047 | } |
048 | else { |
049 | //处理文件 |
050 | fileHandle(file); |
051 | } |
052 | } |
053 | //没有权限 |
054 | else { |
055 | Resources res = getResources(); |
056 | new AlertDialog.Builder( this ).setTitle( "Message" ) |
057 | .setMessage(res.getString(R.string.no_permission)) |
058 | .setPositiveButton( "OK" , new OnClickListener() { |
059 | @Override |
060 | public void onClick(DialogInterface dialog, int which) { |
061 | |
062 | } |
063 | }).show(); |
064 | } |
065 | super .onListItemClick(l, v, position, id); |
066 | } |
067 | //对文件进行增删改 |
068 | private void fileHandle( final File file){ |
069 | OnClickListener listener = new DialogInterface.OnClickListener() { |
070 | @Override |
071 | public void onClick(DialogInterface dialog, int which) { |
072 | // 打开文件 |
073 | if (which == 0 ){ |
074 | openFile(file); |
075 | } |
076 | //修改文件名 |
077 | else if (which == 1 ){ |
078 | LayoutInflater factory = LayoutInflater.from(MainActivity. this ); |
079 | view = factory.inflate(R.layout.rename_dialog, null ); |
080 | editText = (EditText)view.findViewById(R.id.editText); |
081 | editText.setText(file.getName()); |
082 | |
083 | OnClickListener listener2 = new DialogInterface.OnClickListener() { |
084 | @Override |
085 | public void onClick(DialogInterface dialog, int which) { |
086 | // TODO Auto-generated method stub |
087 | String modifyName = editText.getText().toString(); |
088 | final String fpath = file.getParentFile().getPath(); |
089 | final File newFile = new File(fpath + "/" + modifyName); |
090 | if (newFile.exists()){ |
091 | //排除没有修改情况 |
092 | if (!modifyName.equals(file.getName())){ |
093 | new AlertDialog.Builder(MainActivity. this ) |
094 | .setTitle( "注意!" ) |
095 | .setMessage( "文件名已存在,是否覆盖?" ) |
096 | .setPositiveButton( "确定" , new DialogInterface.OnClickListener() { |
097 | @Override |
098 | public void onClick(DialogInterface dialog, int which) { |
099 | if (file.renameTo(newFile)){ |
100 | showFileDir(fpath); |
101 | displayToast( "重命名成功!" ); |
102 | } |
103 | else { |
104 | displayToast( "重命名失败!" ); |
105 | } |
106 | } |
107 | }) |
108 | .setNegativeButton( "取消" , new DialogInterface.OnClickListener() { |
109 | @Override |
110 | public void onClick(DialogInterface dialog, int which) { |
111 | |
112 | } |
113 | }) |
114 | .show(); |
115 | } |
116 | } |
117 | else { |
118 | if (file.renameTo(newFile)){ |
119 | showFileDir(fpath); |
120 | displayToast( "重命名成功!" ); |
121 | } |
122 | else { |
123 | displayToast( "重命名失败!" ); |
124 | } |
125 | } |
126 | } |
127 | }; |
128 | AlertDialog renameDialog = new AlertDialog.Builder(MainActivity. this ).create(); |
129 | renameDialog.setView(view); |
130 | renameDialog.setButton( "确定" , listener2); |
131 | renameDialog.setButton2( "取消" , new DialogInterface.OnClickListener() { |
132 | @Override |
133 | public void onClick(DialogInterface dialog, int which) { |
134 | // TODO Auto-generated method stub |
135 | |
136 | } |
137 | }); |
138 | renameDialog.show(); |
139 | } |
140 | //删除文件 |
141 | else { |
142 | new AlertDialog.Builder(MainActivity. this ) |
143 | .setTitle( "注意!" ) |
144 | .setMessage( "确定要删除此文件吗?" ) |
145 | .setPositiveButton( "确定" , new DialogInterface.OnClickListener() { |
146 | @Override |
147 | public void onClick(DialogInterface dialog, int which) { |
148 | if (file.delete()){ |
149 | //更新文件列表 |
150 | showFileDir(file.getParent()); |
151 | displayToast( "删除成功!" ); |
152 | } |
153 | else { |
154 | displayToast( "删除失败!" ); |
155 | } |
156 | } |
157 | }) |
158 | .setNegativeButton( "取消" , new DialogInterface.OnClickListener() { |
159 | @Override |
160 | public void onClick(DialogInterface dialog, int which) { |
161 | |
162 | } |
163 | }).show(); |
164 | } |
165 | } |
166 | }; |
167 | //选择文件时,弹出增删该操作选项对话框 |
168 | String[] menu = { "打开文件" , "重命名" , "删除文件" }; |
169 | new AlertDialog.Builder(MainActivity. this ) |
170 | .setTitle( "请选择要进行的操作!" ) |
171 | .setItems(menu, listener) |
172 | .setPositiveButton( "取消" , new DialogInterface.OnClickListener() { |
173 | @Override |
174 | public void onClick(DialogInterface dialog, int which) { |
175 | |
176 | } |
177 | }).show(); |
178 | } |
179 | //打开文件 |
180 | private void openFile(File file){ |
181 | Intent intent = new Intent(); |
182 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
183 | intent.setAction(android.content.Intent.ACTION_VIEW); |
184 | |
185 | String type = getMIMEType(file); |
186 | intent.setDataAndType(Uri.fromFile(file), type); |
187 | startActivity(intent); |
188 | } |
189 | //获取文件mimetype |
190 | private String getMIMEType(File file){ |
191 | String type = "" ; |
192 | String name = file.getName(); |
193 | //文件扩展名 |
194 | String end = name.substring(name.lastIndexOf( "." ) + 1 , name.length()).toLowerCase(); |
195 | if (end.equals( "m4a" ) || end.equals( "mp3" ) || end.equals( "wav" )){ |
196 | type = "audio" ; |
197 | } |
198 | else if (end.equals( "mp4" ) || end.equals( "3gp" )) { |
199 | type = "video" ; |
200 | } |
201 | else if (end.equals( "jpg" ) || end.equals( "png" ) || end.equals( "jpeg" ) || end.equals( "bmp" ) || end.equals( "gif" )){ |
202 | type = "image" ; |
203 | } |
204 | else { |
205 | //如果无法直接打开,跳出列表由用户选择 |
206 | type = "*" ; |
207 | } |
208 | type += "/*" ; |
209 | return type; |
210 | } |
211 | private void displayToast(String message){ |
212 | Toast.makeText(MainActivity. this , message, Toast.LENGTH_SHORT).show(); |
213 | } |
214 | } |
自定义适配器:
01 | public class MyAdapter extends BaseAdapter{ |
02 | private LayoutInflater inflater; |
03 | private Bitmap directory,file; |
04 | //存储文件名称 |
05 | private ArrayList<String> names = null ; |
06 | //存储文件路径 |
07 | private ArrayList<String> paths = null ; |
08 | //参数初始化 |
09 | public MyAdapter(Context context,ArrayList<String> na,ArrayList<String> pa){ |
10 | names = na; |
11 | paths = pa; |
12 | directory = BitmapFactory.decodeResource(context.getResources(),R.drawable.d); |
13 | file = BitmapFactory.decodeResource(context.getResources(),R.drawable.f); |
14 | //缩小图片 |
15 | directory = small(directory, 0 .16f); |
16 | file = small(file, 0 .1f); |
17 | inflater = LayoutInflater.from(context); |
18 | } |
19 | @Override |
20 | public int getCount() { |
21 | // TODO Auto-generated method stub |
22 | return names.size(); |
23 | } |
24 |
25 | @Override |
26 | public Object getItem( int position) { |
27 | // TODO Auto-generated method stub |
28 | return names.get(position); |
29 | } |
30 |
31 | @Override |
32 | public long getItemId( int position) { |
33 | // TODO Auto-generated method stub |
34 | return position; |
35 | } |
36 |
37 | @Override |
38 | public View getView( int position, View convertView, ViewGroup parent) { |
39 | // TODO Auto-generated method stub |
40 | ViewHolder holder; |
41 | if ( null == convertView){ |
42 | convertView = inflater.inflate(R.layout.file, null ); |
43 | holder = new ViewHolder(); |
44 | holder.text = (TextView)convertView.findViewById(R.id.textView); |
45 | holder.image = (ImageView)convertView.findViewById(R.id.imageView); |
46 | |
47 | convertView.setTag(holder); |
48 | } |
49 | else { |
50 | holder = (ViewHolder)convertView.getTag(); |
51 | } |
52 | File f = new File(paths.get(position).toString()); |
53 | if (names.get(position).equals( "@1" )){ |
54 | holder.text.setText( "/" ); |
55 | holder.image.setImageBitmap(directory); |
56 | } |
57 | else if (names.get(position).equals( "@2" )){ |
58 | holder.text.setText( ".." ); |
59 | holder.image.setImageBitmap(directory); |
60 | } |
61 | else { |
62 | holder.text.setText(f.getName()); |
63 | if (f.isDirectory()){ |
64 | holder.image.setImageBitmap(directory); |
65 | } |
66 | else if (f.isFile()){ |
67 | holder.image.setImageBitmap(file); |
68 | } |
69 | else { |
70 | System.out.println(f.getName()); |
71 | } |
72 | } |
73 | return convertView; |
74 | } |
75 | private class ViewHolder{ |
76 | private TextView text; |
77 | private ImageView image; |
78 | } |
79 | private Bitmap small(Bitmap map, float num){ |
80 | Matrix matrix = new Matrix(); |
81 | matrix.postScale(num, num); |
82 | return Bitmap.createBitmap(map, 0 , 0 ,map.getWidth(),map.getHeight(),matrix, true ); |
83 | } |
84 | } |
因为要对文件进行操作,所以在描述文件中授权:
01 | <?xml version= "1.0" encoding= "utf-8" ?> |
02 | <manifest xmlns:android= "http://schemas.android.com/apk/res/android" |
03 | package = "com.test.filemanager" |
04 | android:versionCode= "1" |
05 | android:versionName= "1.0" > |
06 | <uses-sdk android:minSdkVersion= "10" /> |
07 | <strong> <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> |
08 | <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /></strong> <application android:icon= "@drawable/icon" android:label= "@string/app_name" > |
09 | <activity android:name= ".MainActivity" |
10 | android:label= "@string/app_name" > |
11 | <intent-filter> |
12 | <action android:name= "android.intent.action.MAIN" /> |
13 | <category android:name= "android.intent.category.LAUNCHER" /> |
14 | </intent-filter> |
15 | </activity> |
16 |
17 | </application> |
18 | </manifest> |
运行结果如下:
查看目录文件
文件重命名:
删除文件:
打开文件: