- 浏览: 14541 次
- 性别:
- 来自: 杭州
文章分类
最新评论
这是一个有图标的文件资源管理器,也许在网上的基于Android的market上有很多比较精美的文件资源管理器,这里我拿这个出来讲并不在于我做的界面如何的精美,而相反我这里的重点并不在界面,我只是想通过这么个列子和大家一起分享Android开发中的一下知识点:(1)目录的遍历(2)自定义Adapter(3)如何取得文件类型,以及调用系统打开对应的文件。这三点也是本程序的关键点所在,如果将这三个知识点掌握了,我想理解这个应用程序也就不再话下。
那么现在让我们一起来阅读代码吧,首先我们知道Android API提供的ArrayAdapter对象只允许存入String数组或List对象,所以在显示文件列表时,只能以一段字符串来显示文件的名称,如果要同时显示文件夹和文件的图标,以及文件名称,甚至文件类型、大小等信息,则必须要自定义一个实现Adapter Interface的对象,就可以自定义想要呈现的Layout,达到同时显示图片文件ICON与多个文字信息的效果,Android API中提供了BaseAdapter(Android.widget.BaseAdapter)对象,只要继承此对象就可以实现出属于自己的Adapter。
实现此范例时,须要先准备文件图标的ICON图片文件,并保存在/res/drawable/文件夹下,图片文件路径如下:
1 |
/res/drawable/back01.png; 回到根目录的图标 |
2 |
/res/drawable/back02.png; 回到上一层的图标
|
3 |
/res/drawable/doc.png; 文件的图标
|
4 |
/res/drawable/folder.png; 文件夹的图标
|
运行效果图:
源码:
package com.zchening.inote; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.ListView; public class OpenActivity extends ListActivity { /* 变量声明 items:存放显示的名称 paths:存放文件路径 rootPath:起始目录 */ private List<String> items=null; private List<String> paths=null; private String rootPath="/"; // private TextView mPath; private String path=""; @Override protected void onCreate(Bundle icicle){ super.onCreate(icicle); /* 载入main.xml Layout */ // setContentView(R.layout.main); /* 初始化mPath,用以显示目前路径 *///@Test@?? // mPath=(TextView)findViewById(R.id.mPath); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ getFileDir(Environment.getExternalStorageDirectory()); }else{ getFileDir(new File(rootPath)); } } /* 取得文件架构的方法 */ private void getFileDir(File fileDir){ /* 设置目前所在路径*/ // mPath.setText(filePath); items=new ArrayList<String>(); paths=new ArrayList<String>(); File f=fileDir; String filePath=f.getPath(); // 取得当前路径下所有文件 File[] files=f.listFiles(); // 如果不是根目录 if(!filePath.equals(rootPath)) { /*第一笔设置为【回到根目录】 */ items.add("b1"); paths.add(rootPath); /*第二笔设置为【回到上一层】 */ items.add("b2"); paths.add(f.getParent()); } if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) && f.getName().equals("sdcard")){ new AlertDialog.Builder(this) .setIcon(R.drawable.alert_dialog_icon2) .setTitle(" SD 卡已卸载或移除,请先安装 SD 卡!") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Intent i=new Intent(OpenActivity.this,MainActivity.class); startActivity(i); } }).show(); } /* 将所有文件添加到ArrayList中 */ for(int i=0;i<files.length;i++){ items.add(files[i].getName()); paths.add(files[i].getPath()); Log.i("FileTest","getpath:"+files[i].getPath()); } MyAdapter adapter=new MyAdapter(this,items,paths); setListAdapter(adapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); String itemName=String.valueOf(l.getItemAtPosition(position)); Log.i("FileTest","itemName"+l.getItemAtPosition(position)); path=paths.get(items.indexOf(itemName)); Log.i("FileTest","path:"+path); File file=new File(path); if (file.isDirectory()){ getFileDir(file); }else{ openFile(file); } } public void openFile(File file){ // 调用getMIMEType()来取得MimeType String type =getMIMEType(file); if (file.getName().endsWith(".txt") || file.getName().endsWith(".hex") || file.getName().endsWith(".dat") || file.getName().endsWith(".ini") || file.getName().endsWith(".log") || file.getName().endsWith(".bin")||file.getName().endsWith(".java") || type.equals("*/*")){ try{ BytesEncodingDetect s = new BytesEncodingDetect(); String code = BytesEncodingDetect.nicename[s.detectEncoding(file)]; String str=String.valueOf(this.readFile(file, code)); Intent i = new Intent(this, EditActivity.class); i.putExtra("path", file.getParent()); Log.i("FileTest","---Path:"+file.getAbsolutePath()+"-----");//@Test@ i.putExtra("self", false); i.putExtra("title", file.getName()); i.putExtra("body", str); startActivity(i); }catch(Exception e){ Log.i("FileTest",e.getMessage()); } }else{/* // 调用getMIMEType()来取得MimeType String type =getMIMEType(file); */ // 设置intent的file和MimeType Intent intent=new Intent(); intent.setDataAndType(Uri.fromFile(file),type); startActivity(intent); } } private String getMIMEType(File f) { String type=""; String fName=f.getName(); /* 后缀名 */ String end=fName.substring(fName.lastIndexOf(".")+1,fName.length()).toLowerCase(); Log.i("FileTest","end :" +end);//@Test@ /* 格式 */ if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")||end.equals("xmf")||end.equals("ogg")||end.equals("wav")){ type = "audio"; }else if(end.equals("3gp")||end.equals("mp4")){ type = "video"; }else if(end.equals("jpg")||end.equals("gif")||end.equals("png")||end.equals("jpeg")||end.equals("bmp")){ type = "image"; }else{ type="*"; } type += "/*"; return type; } //读取文本文件 public Object readFile(File file, String code) { StringBuilder sb=null; try{ String myCode = code!=null&&!"".equals(code) ? code : "UTF8"; if (code.equals("GB-2312")||code.equals("OTHER")){ myCode="GBK"; } InputStreamReader read = new InputStreamReader(new FileInputStream(file.getPath()), myCode); BufferedReader fr = new BufferedReader(read); String str=""; sb=new StringBuilder(); while(null!=(str=fr.readLine())){ sb.append(str); sb.append("\r\n"); } fr.close(); if (null!=sb){ return sb.toString(); } }catch (Exception e) { Log.i("FileTest",e.getMessage()); } return sb; } /* * 程序中使用自定义的MyAdapter来设置显示的数据,传入存储文件名称和文件路径的两个List对象, * 使用setListAdapter()将数据设置给ListView.当用户单击item时,onListItemClick()会被触发, * 此时,程序会判断item是文件夹还是文件。是文件夹的话,就调用getFileDir()方法展开下层的目录; * 是文件的话,就运行自定义的openFile()方法打开此文件。在openFile()这个方法中,会先取得文件 * 的MIME TYPE,系统会依传入的MIME TYPE来决定要如何打开文件,如果无法判断,则直接跳出应用程序 * 列表,让用户选择要用哪一个程序打开。 * */ }
<注>BytesEncodingDetect用于判断文本文件的字符编码(见附件)
MyAdapter.java
package irdc.ex05_11; /* import相关class */ import java.io.File; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; /* 自定义的Adapter,继承android.widget.BaseAdapter */ public class MyAdapter extends BaseAdapter { /* 变量声明 mIcon1 回到根目录的图片文件 mIcon2回到上一层的图片 mIcon3文件夹的图片文件 mIcon4文件的图片 */ private LayoutInflater mInflater; private Bitmap mIcon1; private Bitmap mIcon2; private Bitmap mIcon3; private Bitmap mIcon4; private List items; private List paths; /* MyAdapter的构造器,传入三个参数 */ public MyAdapter(Context context,List it,List pa) { /* 参数初始化*/ mInflater = LayoutInflater.from(context); items = it; paths = pa; // 生成4张图片 mIcon1 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back01); mIcon2 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back02); mIcon3 = BitmapFactory.decodeResource(context.getResources(),R.drawable.folder); mIcon4 = BitmapFactory.decodeResource(context.getResources(),R.drawable.doc); } /* 因继承BaseAdapter,需重写一下方法*/ @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position,View convertView,ViewGroup parent) { ViewHolder holder; if(convertView == null) { /* 使用自定义的file_row作为Layout */ convertView = mInflater.inflate(R.layout.file_row, null); /* 初始化holder的text和icon */ holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } File f=new File(paths.get(position).toString()); /* 设置【回到根目录】的text和icon */ if(items.get(position).toString().equals("b1")) { holder.text.setText("Back to /"); holder.icon.setImageBitmap(mIcon1); } /*设置【回到上一层】的text和icon*/ else if(items.get(position).toString().equals("b2")) { holder.text.setText("Back to .."); holder.icon.setImageBitmap(mIcon2); } /* 设置【文件和文件夹】的text和icon */ else { holder.text.setText(f.getName()); if(f.isDirectory()) { holder.icon.setImageBitmap(mIcon3); } else { holder.icon.setImageBitmap(mIcon4); } } return convertView; } /* class ViewHolder */ private class ViewHolder { TextView text; ImageView icon; } }
自定义的Adapter对象,并以file_row.xml作为Layout,程序中依照文件的类型来决定要显示的图标是什么。
file_row.xml
<!--?xml version="1.0" encoding="utf-8"?--> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <imageview android:id="@+id/icon" android:layout_width="30dip" android:layout_height="30dip"> </imageview> <textview android:id="@+id/text" android:layout_gravity="center_vertical" android:layout_width="0dip" android:layout_weight="1.0" android:layout_height="wrap_content" android:textcolor="@drawable/black"> </textview> </linearlayout>
写在最后:本范例重点在于如何通过实现自定义的Adapter对象来自定义想要呈现的Layout,以及如何在手机上实现打开文件的功能。
通过自定义的Adapter,可以在ListView中放入任何想要呈现的widget对象,如RadioButton、CheckBox、EditText等,如此一来,在开发程序时,就可以做更多样化得应用。
在主程序中自定义了openFile()这个方法来做打开文件的动作,程序内容如下
/* 调用getMIMEType()来取得MimeType */ String type = getMIMEType(f); /* 设置intent的file和MimeType */ intent.setDataAndType(Uri.fromFile(f),type); startActivity(intent);
其中使用intent.setDataAndType(Uri,type)来指定要打开的文件及文件的MIME Type,并以startActivity()的方式来打开文件。getMIMEType()这个方法中,依据文件的拓展名来设置文件的MIME Type,MIME Type格式为“文件类型/文件拓展名”,目前程序中针对部分类型的文件做MIME Type的判断,其余的文件则一律将MIME Type设置为“*/*”,当系统受到文件的类型为“*”时,会自动弹出应用程序的菜单,让用户自己选择要用哪个程序打开文件。
-----------------------------------------------------
<注>
部分代码参考自《Android SDK范例大全》
附件:判断文本文件的字符编码
- BytesEncodingDetect.rar (29.7 KB)
- 描述: BytesEncodingDetect
- 下载次数: 77
相关推荐
Android应用程序在运行的时候,资源管理器AssetManager和Resources会根据当前的机器设置,即屏幕大小、密度、方向,以及国家、地区语言的信息,查找正确的资源,并且进行解析,最后将它们渲染在UI上。这个PPT讲...
在Android系统中,资源管理器是一个至关重要的组件,它负责管理和加载应用程序以及系统中的各种资源,如图片、字符串、布局文件等。这个压缩包文件"sdcard_man"可能包含了与SD卡管理相关的源代码,这将涉及到Android...
1.任务管理器功能:可以查看系统正在运行的有哪些程序,这些程序分别占用了多少资源; 2.查看程序详细信息:触点程序名称打开菜单,可查看该程序的详细信息 3.卸载程序:不仅能够卸载你自己安装的程序,还能够卸载你...
程序说明 -----------------------------... 小安任务助手是一款简单易用的任务管理软件,它可以使用户更方便的关闭正在运行的程序,显示手机CPU、内存、SD卡和电池状态等系统信息,还可用来卸载用户已安装的应用软件。
通过分析这些文件,我们可以了解到Android文件管理器的构建流程、界面设计、权限控制以及资源管理等方面的知识。理解并掌握这些内容对于Android开发者来说,不仅可以提升对Android系统底层运作的理解,也有助于构建...
【Android小型资源管理器】是一个自行开发的应用程序,旨在帮助用户轻松浏览并管理SD卡上的文件和目录。这款简易的资源管理器实现了基本的文件查看和操作功能,如浏览目录结构以及通过长按操作删除文件。尽管应用在...
在Android系统中,任务管理器(Task Manager)扮演着至关重要的角色,它负责监控和管理运行中的应用程序,优化系统资源的分配,以及协助用户管理和控制设备的性能。Android任务管理器的工作原理、功能以及如何使用是...
下面将详细介绍与"Android管理应用程序"相关的代码、资源路径以及相关知识点。 一、代码层面 1. 获取已安装应用列表: 在Android中,通过`PackageManager`类可以获取到设备上已安装的所有应用信息。以下代码片段...
在Android系统中,进程管理是至关重要的一个环节,它涉及到应用程序的运行效率、资源占用以及系统的稳定性。这个“个人编写Android进程管理器源代码”旨在提供一个自定义的解决方案,帮助开发者更好地理解和控制...
Android 文件管理器是一款用于在Android设备上浏览、操作和管理文件的应用程序。它允许用户查看、复制、移动、删除、重命名以及分享存储在设备内部或外部存储卡上的文件。这款应用的源码对于Android开发者来说是宝贵...
在Android系统中,任务管理器(Task Manager)是至关重要的组件,它负责监控和管理运行在设备上的应用程序和进程。本项目"Android任务管理器源码"提供了查看和控制应用程序进程的功能,包括显示当前所有应用的进程、...
这个“Android小程序源代码集合”是一个极好的资源,适合初学者入门,同时也因为其简单易懂的特点,使得学习过程更为顺畅。 一、Android小程序基础 Android小程序基于Java语言开发,利用Google的Android SDK工具。...
在Android操作系统中,任务管理器是一个至关重要的组件,它负责监控和管理系统的应用程序及进程,确保设备高效、稳定地运行。下面将详细讲解Android任务管理器的工作原理、功能以及如何查看和管理正在运行的任务和...
在Android系统中,任务管理器(Task Manager)是至关重要的组件之一,它负责监控和管理运行中的应用程序和服务,确保系统的高效稳定运行。本资源“Android 任务管理器源码.zip”提供了一个深入理解Android任务管理...
本篇将深入探讨一个名为"文件管理器FileManager"的经典Android程序实例,通过源代码分析,帮助开发者理解Android文件系统操作的核心概念和技术。 1. **Android 文件系统概述** Android系统采用Linux内核,因此其...
对后台运行的进程进行管理,可对某个进程进行查看程序详情、杀死进程、打开程序操作 2. 应用管理 对手机全部应用进行管理 3. 系统资源监控 可以实时查看手机运行时的CPU利用率、内存利用率、已使用内存、可用内存、...
在Android平台上,任务管理器是至关重要的组件,它负责管理和监控系统中运行的应用程序和进程。这份【Android精品资源】提供了Android任务管理器的源码,对于开发者来说是一份宝贵的参考资料,可以帮助理解Android...
这里我们讨论的“Android文件管理器源码”是一个开发资源,可以帮助开发者了解如何在Android平台上构建这样的应用。这个源码可能是某个开源项目,提供了文件管理功能的实现细节,对于学习Android应用开发,尤其是...
在Android系统中,任务管理器(Task Manager)扮演着至关重要的角色,它是系统用来管理和监控应用程序运行状态的核心组件。这份“Android程序研发源码Android 任务管理器源码”提供了深入理解Android系统如何处理...
资源管理是Android开发中不可忽视的部分。Android应用可以包含各种资源,如字符串、图片、颜色、样式等,这些资源可以通过R类引用,并且可以在不同语言和屏幕尺寸下自动适配。 AndroidManifest.xml文件是应用的配置...