自定义Android文件管理器----管理SD卡中的文件
来源:互联网 发布:鼎迈网络 编辑:程序博客网 时间:2024/05/16 01:28
1.android文件管理器介绍
android系统并不自带文件管理器,但是很多情况下,我们有诸如从SD中打开文件的需要,就必须借助三方开发的资源管理器,常用的有AndExplorer等。这种情况下发布后,用户还需要安装依赖的软件,非常麻烦。下面介绍在代码中实现资源管理器,只需要一百行左右的一个类即可以最常用的文件选择功能。
2.相关知识
文件管理器一般以固定大小的对话框的方式出现,使用ListView作为文件目录的显示载体。点选目录测进入,点选文件则将所选择文件的Uri返回给调用它的Activity。ListView的使用是实现这个功能的重点。
3. 例程
1) 功能
当用户点击按钮时,调出固定大小的文件管理器,默认显示的目录是SD卡的根目录。用户选择文件后,在界面上显示该文件的路径。
2) 可从此处下载可独立运行的代码
http://download.csdn.net/source/3423094
3) 核心代码及说明
a) 调用资源管理器
Intent intent = new Intent();intent.putExtra("explorer_title", getString(R.string.dialog_read_from_dir)); // 设置文件管理器标题intent.setDataAndType(Uri.fromFile(new File("/sdcard")), "*/*"); // 设置起始文件夹和文件类型intent.setClass(MyActivity.this, ExDialog.class);startActivityForResult(intent, REQUEST_EX);
b) 从资源管理器接收数据
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { String path; if (resultCode == RESULT_OK) { if (requestCode == REQUEST_EX) { Uri uri = intent.getData(); // 接收用户所选文件的路径 TextView text = (TextView) findViewById(R.id.text); text.setText("select: " + uri); // 在界面上显示路径 } }
c)文件管理器类的实现
public class ExDialog extends ListActivity { // ListActivity自带List控件 private List<Map<String, Object>> mData; private String mDir = "/sdcard"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = this.getIntent(); Bundle bl = intent.getExtras(); String title = bl.getString("explorer_title"); // 接收标题内容 Uri uri = intent.getData(); // 接收起始目录 mDir = uri.getPath(); // 设置起始目录 setTitle(title); mData = getData(); // 向链表mData填充目录的数据 MyAdapter adapter = new MyAdapter(this); setListAdapter(adapter); // 设置MyAdapter类为ListView控件提供数据 WindowManager m = getWindowManager(); Display d = m.getDefaultDisplay(); LayoutParams p = getWindow().getAttributes(); p.height = (int) (d.getHeight() * 0.8); p.width = (int) (d.getWidth() * 0.95); getWindow().setAttributes(p); // 设置对话框为固定大小,不因进出目录变化 } private List<Map<String, Object>> getData() { // 将目录数据填充到链表中 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; File f = new File(mDir); // 打开当前目录 File[] files = f.listFiles(); // 获取当前目录中文件列表 if (!mDir.equals("/sdcard")) { // 不充许进入/sdcard上层目录 map = new HashMap<String, Object>(); // 加返回上层目录项 map.put("title", "Back to ../"); map.put("info", f.getParent()); map.put("img", R.drawable.ex_folder); list.add(map); } if (files != null) { // 将目录中文件填加到列表中 for (int i = 0; i < files.length; i++) { map = new HashMap<String, Object>(); map.put("title", files[i].getName()); map.put("info", files[i].getPath()); if (files[i].isDirectory()) // 按不同类型显示不同图标 map.put("img", R.drawable.ex_folder); else map.put("img", R.drawable.ex_doc); list.add(map); } } return list; } // 响应用户点击列表项的事件 @Override protected void onListItemClick(ListView l, View v, int position, long id) { Log.d("MyListView4-click", (String) mData.get(position).get("info")); if ((Integer) mData.get(position).get("img") == R.drawable.ex_folder) { mDir = (String) mData.get(position).get("info"); mData = getData(); //点击目录时进入子目录 MyAdapter adapter = new MyAdapter(this); setListAdapter(adapter); } else { // 点击文件时关闭文件管理器,并将选取结果返回 finishWithResult((String) mData.get(position).get("info")); } } public final class ViewHolder { // 定义每个列表项所含内容 public ImageView img; // 显示图片ID public TextView title; // 文件目录名 public TextView info; // 文件目录描述 } public class MyAdapter extends BaseAdapter { // 实现列表内容适配器 private LayoutInflater mInflater; public MyAdapter(Context context) { this.mInflater = LayoutInflater.from(context); } public int getCount() { // 获取列表项个数 return mData.size(); } public Object getItem(int arg0) { return null; } public long getItemId(int arg0) { return 0; } // 设置每个列表项的显示 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.listview, null); // 设置列表项的布局 holder.img = (ImageView) convertView.findViewById(R.id.img); holder.title = (TextView) convertView.findViewById(R.id.title); holder.info = (TextView) convertView.findViewById(R.id.info); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img.setBackgroundResource((Integer) Data.get(position).get( "img")); // 根据位置position设置具体内容 holder.title.setText((String) Data.get(position).get("title")); holder.info.setText((String) mData.get(position).get("info")); return convertView; } } private void finishWithResult(String path) { Bundle conData = new Bundle(); conData.putString("results", "Thanks Thanks"); Intent intent = new Intent(); // 以intent的方式将结果返回调用类 intent.putExtras(conData); Uri startDir = Uri.fromFile(new File(path)); intent.setDataAndType(startDir, "vnd.android.cursor.dir/lysesoft.andexplorer.file"); setResult(RESULT_OK, intent); finish(); }};
- 自定义Android文件管理器----管理SD卡中的文件
- Android读写SD卡中的txt文件
- Android自定义适配器---实现简单文件管理器
- android中对sd卡文件的管理
- Android 的ListView操作实例,文件管理器SD卡的读取操作
- Android 4.4文件管理器免ROOT破除外置SD卡限制
- 自定义文件管理器
- android读取内存和sd卡中的txt文件
- 关于android开发中的文件和sd卡问题
- Android 读取SD卡中的text文件内容
- Android中加载手机sd卡中的html文件
- Android SD卡文件浏览器
- android 读取SD卡文件
- android sd卡文件读取
- Android SD卡写文件
- android 读写SD卡文件
- android 读取SD卡文件
- Android操作SD卡文件
- 泰信iPhone手机摇控器简介
- MTK平台上读取LCM error report
- KVC的概述与使用
- c++内置类型和标准库类型
- acer(宏碁) Aspire S3-951 笔记本无线网卡连接不稳定原因及解决
- 自定义Android文件管理器----管理SD卡中的文件
- SpringMVC流程走向图
- 常用控制字符ASCII码
- 苹果官方给出的代替[UIDevice uniqueIdentifier]获取UDID的方法
- mfc解决回车键默认关闭窗口的一般方法
- android中处理多按钮怎么监听解决办法
- VS.NET2010水晶报表安装部署[VS2010]
- 判断ios版本
- Linux高编之进程————fork函数的使用(1)