`
836811384
  • 浏览: 575339 次
文章分类
社区版块
存档分类
最新评论

android 文件管理器的源码实现

 
阅读更多

1. android文件管理器介绍
android系统并不自带文件管理器,但是很多情况下,我们有诸如从SD中打开文件的需要,就必须借助三方开发的资源管理器,常用的有AndExplorer等。这种情况下发布后,用户还需要安装依赖的软件,非常麻烦。下面介绍在代码中实现资源管理器,只需要一百行左右的一个类即可以最常用的文件选择功能。

2. 相关知识
文件管理器一般以固定大小的对话框的方式出现,使用ListView作为文件目录的显示载体。点选目录测进入,点选文件则将所选择文件的Uri返回给调用它的Activity。ListView的使用是实现这个功能的重点。

3. 例程

1) 功能
当用户点击按钮时,调出固定大小的文件管理器,默认显示的目录是SD卡的根目录。用户选择文件后,在界面上显示该文件的路径。

2) 可从此处下载可独立运行的代码
http://download.csdn.net/detail/jrcisme/4163862

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文件管理器源码

    总的来说,这个自定义的Android文件管理器源码涵盖了文件操作的基本功能,通过解析和学习,开发者可以了解Android文件操作的实现细节,提高自己的编程技能。同时,这也为定制化文件管理器提供了参考,开发者可以根据...

    Android 文件管理器源码.rar

    "Android 文件管理器源码.rar"是一个包含Android文件管理器应用程序源代码的压缩包,旨在供开发者参考和学习。通过研究这份源码,开发者可以深入理解Android系统中的文件操作、UI设计以及相关API的使用。 1. **文件...

    安卓Android源码——文件管理器源码.zip

    【描述】描述中提到的"安卓Android源码——文件管理器源码.zip"是一个包含了实现Android文件管理器功能的源代码集合。这个压缩包可能包含了一系列的图片资源(1_120828192520_1.png和1_120828192520_2.png),这些...

    Android 文件管理器源码.zip

    Android文件管理器通常基于Android的文件系统结构,如Linux的EXT4文件系统,这包括根目录、内部存储、外部存储(SD卡)等。源码会展示如何遍历这些目录,并显示在UI上。在Android中,文件和目录的访问通常通过`java....

    Android 文件管理器源码

    本文将深入解析一个自编的Android文件管理器源码,旨在帮助开发者理解和实现自己的文件管理应用。 首先,我们关注的是源码中的核心功能。一个基本的文件管理器通常包括以下部分: 1. **文件浏览与目录结构**:源码...

    Android 小米文件管理器源码.rar

    《深入解析:Android小米文件管理器源码》 在Android开发领域,理解并研究系统级应用的源码是提升技术水平的重要途径。今天我们将探讨的是小米文件管理器的源码,通过对这一常用应用的源码分析,我们可以深入了解...

    Android文件管理器源码!

    总之,这个"Android文件管理器源码!"提供了学习Android文件操作、压缩解压缩技术以及用户交互设计的良好实践。通过研究和理解这段代码,开发者不仅可以提升自己的编程技能,还能深入了解Android平台的文件系统管理...

    安卓Android源码——MIUI文件管理器.zip

    【安卓Android源码——MIUI文件管理器】 在Android操作系统中,MIUI是小米公司推出的一个深度定制的用户界面,它以其丰富的功能和独特的设计深受用户喜爱。本压缩包文件包含的是MIUI文件管理器的源代码,对于开发者...

    android文件管理器源码

    此外,Android文件管理器还可能涉及其他技术,如使用`Intent`打开不同类型的文件(音乐、图片、文档等),权限管理(读写权限、外部存储访问权限),以及针对不同设备特性的适配(如SD卡支持)。 在阅读和分析源码...

    Android 文件资源管理器源码

    这里我们关注的是"Android 文件资源管理器2.0"的源码,这是一个包含两个主要模块的实现:文件管理和任务管理。 **文件管理部分** 文件管理模块是资源管理器的核心,它涉及以下关键知识点: 1. **文件系统接口**:...

    Android小米文件管理器源码

    本话题主要聚焦于"Android小米文件管理器源码",这是一个专为大学学习者设计的项目,旨在帮助他们深入理解Android应用的内部工作原理,特别是文件管理和用户界面设计。 小米文件管理器是一款广泛使用的应用,它允许...

    android 文件管理器源码

    很实用的源码,包含文件管理器的基本实现思路和原理,及其方式 一、首先得到手机SDCard跟目录及所有文件对象 二、将这些文件目录信息包装进Adapter 三、将Adapter数据设置给ListView控件显示

    Android应用源码可以管理U盘的文件管理器

    总的来说,开发一个可以管理U盘的Android文件管理器需要对Android的USB API、文件操作和UI设计有深入理解。通过分析和学习提供的源码,开发者可以学习到如何与USB设备交互,如何高效地读写文件,以及如何构建用户...

Global site tag (gtag.js) - Google Analytics