0

0

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

高洛峰

高洛峰

发布时间:2017-01-21 14:27:22

|

1517人浏览过

|

来源于php中文网

原创

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

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

先看布局文件:

layout/main.xml




文件列表布局:

layout/file.xml






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

layout/rename_dialog.xml



 

主Activity:

public class MainActivity extends ListActivity {
 private static final String ROOT_PATH = "/";
 //存储文件名称
 private ArrayList names = null;
 //存储文件路径
 private ArrayList 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();
  paths = new ArrayList();
  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 names = null;
 //存储文件路径
 private ArrayList paths = null;
 //参数初始化
 public MyAdapter(Context context,ArrayList na,ArrayList 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);
 }
}

  

多奥淘宝客程序API免费版 F8.0
多奥淘宝客程序API免费版 F8.0

多奥淘宝客程序免费版拥有淘宝客站点的基本功能,手动更新少,管理简单等优点,适合刚接触网站的淘客们,或者是兼职做淘客们。同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。4月3日淘宝联盟重新开放淘宝API申请,新用户也可使用了

下载

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



 
  
 
 
  
   
    
    
   
  
 

运行结果如下:

查看目录文件

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

文件重命名:

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

删除文件:

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

打开文件:

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

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

更多Android开发之简单文件管理器实现方法相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

90

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

15

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

10

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

6

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

7

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

25

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

28

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 1.7万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号