Android开发之简单文件管理器实现方法

本文实例讲述了Android开发之简单文件管理器实现方法。分享给大家供大家参考,具体如下:

这里运用Java I/O、ListActivity、Dialog、Bitmap等实现简单文件管理器,可以查看目录文件,修改文件名,删除文件,打开文件。比较简单,直接看代码:

先看布局文件:

layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<ListView
 android:id="@android:id/list"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
</LinearLayout>

文件列表布局:

layout/file.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/imageView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
/>
<TextView
 android:id="@+id/textView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textSize="14sp">
</TextView>
</LinearLayout>

修改文件名对话框布局文件:

layout/rename_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <EditText
  android:id="@+id/editText"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
 />
</LinearLayout>

主Activity:

public class MainActivity extends ListActivity {
 private static final String ROOT_PATH = "/";
 //存储文件名称
 private ArrayList<String> names = null;
 //存储文件路径
 private ArrayList<String> paths = null;
 private View view;
 private EditText editText;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //显示文件列表
  showFileDir(ROOT_PATH);
 }
 private void showFileDir(String path){
  names = new ArrayList<String>();
  paths = new ArrayList<String>();
  File file = new File(path);
  File[] files = file.listFiles();
  //如果当前目录不是根目录
  if (!ROOT_PATH.equals(path)){
   names.add("@1");
   paths.add(ROOT_PATH);
   names.add("@2");
   paths.add(file.getParent());
  }
  //添加所有文件
  for (File f : files){
   names.add(f.getName());
   paths.add(f.getPath());
  }
  this.setListAdapter(new MyAdapter(this,names, paths));
 }
 @Override
 protected void onListItemClick(ListView l, View v, int position, long id) {
  String path = paths.get(position);
  File file = new File(path);
  // 文件存在并可读
  if (file.exists() && file.canRead()){
   if (file.isDirectory()){
    //显示子目录及文件
    showFileDir(path);
   }
   else{
    //处理文件
    fileHandle(file);
   }
  }
  //没有权限
  else{
   Resources res = getResources();
   new AlertDialog.Builder(this).setTitle("Message")
   .setMessage(res.getString(R.string.no_permission))
   .setPositiveButton("OK",new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
   }).show();
  }
  super.onListItemClick(l, v, position, id);
 }
 //对文件进行增删改
 private void fileHandle(final File file){
  OnClickListener listener = new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    // 打开文件
    if (which == 0){
     openFile(file);
    }
    //修改文件名
    else if(which == 1){
     LayoutInflater factory = LayoutInflater.from(MainActivity.this);
     view = factory.inflate(R.layout.rename_dialog, null);
     editText = (EditText)view.findViewById(R.id.editText);
     editText.setText(file.getName());
     OnClickListener listener2 = new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       // TODO Auto-generated method stub
       String modifyName = editText.getText().toString();
       final String fpath = file.getParentFile().getPath();
       final File newFile = new File(fpath + "/" + modifyName);
       if (newFile.exists()){
        //排除没有修改情况
        if (!modifyName.equals(file.getName())){
         new AlertDialog.Builder(MainActivity.this)
         .setTitle("注意!")
         .setMessage("文件名已存在,是否覆盖?")
         .setPositiveButton("确定", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
           if (file.renameTo(newFile)){
            showFileDir(fpath);
            displayToast("重命名成功!");
           }
           else{
            displayToast("重命名失败!");
           }
          }
         })
         .setNegativeButton("取消", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
          }
         })
         .show();
        }
       }
       else{
        if (file.renameTo(newFile)){
         showFileDir(fpath);
         displayToast("重命名成功!");
        }
        else{
         displayToast("重命名失败!");
        }
       }
      }
     };
     AlertDialog renameDialog = new AlertDialog.Builder(MainActivity.this).create();
     renameDialog.setView(view);
     renameDialog.setButton("确定", listener2);
     renameDialog.setButton2("取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       // TODO Auto-generated method stub
      }
     });
     renameDialog.show();
    }
    //删除文件
    else{
     new AlertDialog.Builder(MainActivity.this)
     .setTitle("注意!")
     .setMessage("确定要删除此文件吗?")
     .setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       if(file.delete()){
        //更新文件列表
        showFileDir(file.getParent());
        displayToast("删除成功!");
       }
       else{
        displayToast("删除失败!");
       }
      }
     })
     .setNegativeButton("取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      }
     }).show();
    }
   }
  };
  //选择文件时,弹出增删该操作选项对话框
  String[] menu = {"打开文件","重命名","删除文件"};
  new AlertDialog.Builder(MainActivity.this)
  .setTitle("请选择要进行的操作!")
  .setItems(menu, listener)
  .setPositiveButton("取消", new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
   }
  }).show();
 }
 //打开文件
 private void openFile(File file){
  Intent intent = new Intent();
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.setAction(android.content.Intent.ACTION_VIEW);
  String type = getMIMEType(file);
  intent.setDataAndType(Uri.fromFile(file), type);
  startActivity(intent);
 }
 //获取文件mimetype
 private String getMIMEType(File file){
  String type = "";
  String name = file.getName();
  //文件扩展名
  String end = name.substring(name.lastIndexOf(".") + 1, name.length()).toLowerCase();
  if (end.equals("m4a") || end.equals("mp3") || end.equals("wav")){
   type = "audio";
  }
  else if(end.equals("mp4") || end.equals("3gp")) {
   type = "video";
  }
  else if (end.equals("jpg") || end.equals("png") || end.equals("jpeg") || end.equals("bmp") || end.equals("gif")){
   type = "image";
  }
  else {
   //如果无法直接打开,跳出列表由用户选择
   type = "*";
  }
  type += "/*";
  return type;
 }
 private void displayToast(String message){
  Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
 }
}

自定义适配器:

public class MyAdapter extends BaseAdapter{
 private LayoutInflater inflater;
 private Bitmap directory,file;
 //存储文件名称
 private ArrayList<String> names = null;
 //存储文件路径
 private ArrayList<String> paths = null;
 //参数初始化
 public MyAdapter(Context context,ArrayList<String> na,ArrayList<String> pa){
  names = na;
  paths = pa;
  directory = BitmapFactory.decodeResource(context.getResources(),R.drawable.d);
  file = BitmapFactory.decodeResource(context.getResources(),R.drawable.f);
  //缩小图片
  directory = small(directory,0.16f);
  file = small(file,0.1f);
  inflater = LayoutInflater.from(context);
 }
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return names.size();
 }
 @Override
 public Object getItem(int position) {
  // TODO Auto-generated method stub
  return names.get(position);
 }
 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  ViewHolder holder;
  if (null == convertView){
   convertView = inflater.inflate(R.layout.file, null);
   holder = new ViewHolder();
   holder.text = (TextView)convertView.findViewById(R.id.textView);
   holder.image = (ImageView)convertView.findViewById(R.id.imageView);
   convertView.setTag(holder);
  }
  else {
   holder = (ViewHolder)convertView.getTag();
  }
  File f = new File(paths.get(position).toString());
  if (names.get(position).equals("@1")){
   holder.text.setText("/");
   holder.image.setImageBitmap(directory);
  }
  else if (names.get(position).equals("@2")){
   holder.text.setText("..");
   holder.image.setImageBitmap(directory);
  }
  else{
   holder.text.setText(f.getName());
   if (f.isDirectory()){
    holder.image.setImageBitmap(directory);
   }
   else if (f.isFile()){
    holder.image.setImageBitmap(file);
   }
   else{
    System.out.println(f.getName());
   }
  }
  return convertView;
 }
 private class ViewHolder{
  private TextView text;
  private ImageView image;
 }
 private Bitmap small(Bitmap map,float num){
  Matrix matrix = new Matrix();
  matrix.postScale(num, num);
  return Bitmap.createBitmap(map,0,0,map.getWidth(),map.getHeight(),matrix,true);
 }
}

因为要对文件进行操作,所以在描述文件中授权:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.test.filemanager"
  android:versionCode="1"
  android:versionName="1.0">
 <uses-sdk android:minSdkVersion="10" />
 <strong> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></strong>
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".MainActivity"
     android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>
</manifest>

运行结果如下:

查看目录文件

文件重命名:

删除文件:

打开文件:

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • android文件管理器用法详解

    很久没有写东西了,鉴于某某同学文件管理器不会,这里简单介绍一下,同时写一个demon,参考了网上别人写的代码,自己也学习学习,研究研究. 首先所谓文件管理器,看起来就是一个列表,列表里面是文件夹或者文件,首先把布局写出来,我想在最上方的左边显示文件的路径,右边显示该路径下的文件个数,其实还是一个遍历文件,然后用列表显示出来的问题.下面是ListView,用来显示文件列表.下面是运行的效果图: 主界面的布局文件如下: <?xml version="1.0" encoding=&qu

  • Android编写简易文件管理模块

    最近在做一个将word文档导入到SQLite的程序.对于文件选择问题,经过再三考虑决定写一个简易的文件管理模块,用来选择需要导入的文件文件 先看下效果图: 思路: 获取存储器接口 遍历当前目录 利用ListView显示文件文件夹 先是布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • 浅析Android文件管理器(项目一)

    文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能,如网络连接.应用程序管理.存档和压缩处理.搜索等. 今晚就写了res下面那些文件,因为在编写逻辑的时候如果资源文件夹没有的话,会非常的苦恼的.所以学习的时候总是会先把资源编写完毕,再开始编写逻辑. 然后我自己也总结一下今晚学了什么吧. IDE : Android Studio 惯例,上代码. 先是

  • Android开发之简单文件管理器实现方法

    本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下: 这里运用Java I/O.ListActivity.Dialog.Bitmap等实现简单文件管理器,可以查看目录文件,修改文件名,删除文件,打开文件.比较简单,直接看代码: 先看布局文件: layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&q

  • Android开发之电话拨号器和短信发送器实现方法

    本文实例讲述了Android开发之电话拨号器和短信发送器实现方法.分享给大家供大家参考,具体如下: 电话拨号器 实现原理:用户输入电话号码,当点击拨打的时候,由监听对象捕获,监听对象通过文本控件获取到用户输入的电话号码,由于系统已经实现了电话拨号功能,所以我们只需要调用这个功能就可以了. 步骤: 1.界面布局 2.编写Activity 3.使用意图过滤器激活电话拨号功能 4.添加电话服务权限(用手机的电话服务,要在清单文件AndroidManifest.xml中添加电话服务权限) 如图所示这三个

  • Android开发中简单设置启动界面的方法

    本文实例讲述了Android开发中简单设置启动界面的方法.分享给大家供大家参考,具体如下: 启动界面的意义是为了让后台处理耗时的复杂工作,当工作处理完成后,即可进入主界面.相比让用户等待布局加载完成,使用一张图片作为启动背景,会带来更好的体验. 首先,需要建立一个简单的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

  • Android开发实现简单的观察者与被观察者示例

    本文实例讲述了Android开发实现简单的观察者与被观察者.分享给大家供大家参考,具体如下: 概述: 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己. 观察者模式结构图 Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个

  • Android开发之图片旋转功能实现方法【基于Matrix】

    本文实例讲述了Android开发之图片旋转功能实现方法.分享给大家供大家参考,具体如下: 在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配.Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作.Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法 .下面是一个乘法的公式

  • Android开发中Toast显示消息的方法小结

    本文实例总结了Android开发中Toast显示消息的方法.分享给大家供大家参考,具体如下: Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失.Toast的提示信息可以在调试程序的时候方便的显示某些想显示的东西. 两种方法创建Toast 第一种方法的Java代码: makeText(Context context, int resId, int duration)

  • 利用OPENCV为android开发畸变校正的JNI库方法

    需要为项目提供一套畸变校正的算法,由于需要大量的矩阵运算,考虑到效率和适时性,使用JNI开发,希望把有关数组短阵的处理的变换全部放入C语言中处理. 主要用于android移动端,大致的数据来源一是从camera直接读取YUV数据,一种是从第三方接读取RGB数据,另一种是直接对BITMAP进行处理. 1.考虑到硬件设备接口,第三方软件接口,图像接口,OPENCV接口,希望能够开发出通用的算法库,一劳永逸的解决各种复杂的使用场景,因此数据要支持YUV,支持ARGB,支持MAT 2android对BI

  • Android开发之计算器GridLayout布局实现方法示例

    本文实例讲述了Android开发之计算器GridLayout布局实现方法.分享给大家供大家参考,具体如下: 运行效果: Demo 下载地址:https://github.com/LonglyWolf/Calculator 或者点击此处本站下载. 按钮布局实现: 一个Linearlayout 嵌套三个TextView 最下方的显示当前计算式.上面为先前的计算式. Gridview 网格布局排布按钮 <?xml version="1.0" encoding="utf-8&q

  • Android开发自定义控件之折线图实现方法详解

    本文实例讲述了Android开发自定义控件之折线图实现方法.分享给大家供大家参考,具体如下: 前言 折线图是Android开发中经常会碰到的效果,但由于涉及自定义View的知识,对许多刚入门的小白来说会觉得很高深.其实不然,接下来我就以尽量通俗的语言来说明下图折线图效果的实现过程. 效果图 实现过程 首先,选择自定义控件的方式. 自定义控件的实现有四种方式: 1.继承View,重写onDraw.onMeasure等方法. 2.继承已有的View(比如TextView). 3.继承ViewGrou

随机推荐