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

前端技术 2023/08/08 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程序设计有所帮助。

本文地址:https://www.stayed.cn/item/542

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。