`
zchening
  • 浏览: 14541 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Android资源管理器程序

阅读更多

     这是一个有图标的文件资源管理器,也许在网上的基于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范例大全》

附件:判断文本文件的字符编码

分享到:
评论

相关推荐

    Android应用程序资源管理框架 PPT

    Android应用程序在运行的时候,资源管理器AssetManager和Resources会根据当前的机器设置,即屏幕大小、密度、方向,以及国家、地区语言的信息,查找正确的资源,并且进行解析,最后将它们渲染在UI上。这个PPT讲...

    android资源管理器源码

    在Android系统中,资源管理器是一个至关重要的组件,它负责管理和加载应用程序以及系统中的各种资源,如图片、字符串、布局文件等。这个压缩包文件"sdcard_man"可能包含了与SD卡管理相关的源代码,这将涉及到Android...

    android程序管理器

    1.任务管理器功能:可以查看系统正在运行的有哪些程序,这些程序分别占用了多少资源; 2.查看程序详细信息:触点程序名称打开菜单,可查看该程序的详细信息 3.卸载程序:不仅能够卸载你自己安装的程序,还能够卸载你...

    Android 资源管理器源代码

    程序说明 -----------------------------... 小安任务助手是一款简单易用的任务管理软件,它可以使用户更方便的关闭正在运行的程序,显示手机CPU、内存、SD卡和电池状态等系统信息,还可用来卸载用户已安装的应用软件。

    android 文件管理器

    通过分析这些文件,我们可以了解到Android文件管理器的构建流程、界面设计、权限控制以及资源管理等方面的知识。理解并掌握这些内容对于Android开发者来说,不仅可以提升对Android系统底层运作的理解,也有助于构建...

    android 小型资源管理器

    【Android小型资源管理器】是一个自行开发的应用程序,旨在帮助用户轻松浏览并管理SD卡上的文件和目录。这款简易的资源管理器实现了基本的文件查看和操作功能,如浏览目录结构以及通过长按操作删除文件。尽管应用在...

    Android 任务管理器

    在Android系统中,任务管理器(Task Manager)扮演着至关重要的角色,它负责监控和管理运行中的应用程序,优化系统资源的分配,以及协助用户管理和控制设备的性能。Android任务管理器的工作原理、功能以及如何使用是...

    android管理应用程序相关代码及资源路径

    下面将详细介绍与"Android管理应用程序"相关的代码、资源路径以及相关知识点。 一、代码层面 1. 获取已安装应用列表: 在Android中,通过`PackageManager`类可以获取到设备上已安装的所有应用信息。以下代码片段...

    个人编写Android进程管理器源代码,可完美运行

    在Android系统中,进程管理是至关重要的一个环节,它涉及到应用程序的运行效率、资源占用以及系统的稳定性。这个“个人编写Android进程管理器源代码”旨在提供一个自定义的解决方案,帮助开发者更好地理解和控制...

    Android 文件管理器

    Android 文件管理器是一款用于在Android设备上浏览、操作和管理文件的应用程序。它允许用户查看、复制、移动、删除、重命名以及分享存储在设备内部或外部存储卡上的文件。这款应用的源码对于Android开发者来说是宝贵...

    Android任务管理器源码

    在Android系统中,任务管理器(Task Manager)是至关重要的组件,它负责监控和管理运行在设备上的应用程序和进程。本项目"Android任务管理器源码"提供了查看和控制应用程序进程的功能,包括显示当前所有应用的进程、...

    Android小程序源代码集合

    这个“Android小程序源代码集合”是一个极好的资源,适合初学者入门,同时也因为其简单易懂的特点,使得学习过程更为顺畅。 一、Android小程序基础 Android小程序基于Java语言开发,利用Google的Android SDK工具。...

    android任务管理器

    在Android操作系统中,任务管理器是一个至关重要的组件,它负责监控和管理系统的应用程序及进程,确保设备高效、稳定地运行。下面将详细讲解Android任务管理器的工作原理、功能以及如何查看和管理正在运行的任务和...

    Android 任务管理器源码.zip

    在Android系统中,任务管理器(Task Manager)是至关重要的组件之一,它负责监控和管理运行中的应用程序和服务,确保系统的高效稳定运行。本资源“Android 任务管理器源码.zip”提供了一个深入理解Android任务管理...

    文件管理器FileManager - 安卓Android程序实例源代码.zip

    本篇将深入探讨一个名为"文件管理器FileManager"的经典Android程序实例,通过源代码分析,帮助开发者理解Android文件系统操作的核心概念和技术。 1. **Android 文件系统概述** Android系统采用Linux内核,因此其...

    android 任务管理器

    对后台运行的进程进行管理,可对某个进程进行查看程序详情、杀死进程、打开程序操作 2. 应用管理 对手机全部应用进行管理 3. 系统资源监控 可以实时查看手机运行时的CPU利用率、内存利用率、已使用内存、可用内存、...

    【Android精品资源】Android任务管理器源码

    在Android平台上,任务管理器是至关重要的组件,它负责管理和监控系统中运行的应用程序和进程。这份【Android精品资源】提供了Android任务管理器的源码,对于开发者来说是一份宝贵的参考资料,可以帮助理解Android...

    Android文件管理器源码

    这里我们讨论的“Android文件管理器源码”是一个开发资源,可以帮助开发者了解如何在Android平台上构建这样的应用。这个源码可能是某个开源项目,提供了文件管理功能的实现细节,对于学习Android应用开发,尤其是...

    Android程序研发源码Android 任务管理器源码.rar

    在Android系统中,任务管理器(Task Manager)扮演着至关重要的角色,它是系统用来管理和监控应用程序运行状态的核心组件。这份“Android程序研发源码Android 任务管理器源码”提供了深入理解Android系统如何处理...

    Android应用程序开发(第三版)课件源程序

    资源管理是Android开发中不可忽视的部分。Android应用可以包含各种资源,如字符串、图片、颜色、样式等,这些资源可以通过R类引用,并且可以在不同语言和屏幕尺寸下自动适配。 AndroidManifest.xml文件是应用的配置...

Global site tag (gtag.js) - Google Analytics