Android Studio实现文件管理器

news2024/12/23 10:32:09

项目目录

  • 一、项目概述
  • 二、开发环境
  • 三、详细设计
    • 1、布局设计
    • 2、程序运行时申请权限
    • 3、查看文件
    • 4、删除文件
    • 5、搜索文件
    • 6、新建文件
  • 四、运行演示

一、项目概述

本次带来的文件管理器,能够对SD卡的目录进行管理。主要功能包括新建文件(夹)、查看文件(夹)、搜索文件(夹)、删除文件(夹)、回到根目录。涉及知识点包括动态申请权限、自定义Dialog、自定义菜单、文件系统操作、适配器等。

二、开发环境

开发环境依旧是在Android Studio4.2.1,只要你的AS是近两年从官网下载的,都是可以满足的。日期版本是比4.2.1高的。
在这里插入图片描述

三、详细设计

1、布局设计

我们先看下主页面的布局:父标签是RelativeLayout,相对布局用来布置位置是最适合的。最上方使用Toolbar替代原生的ActionBar,在替代前需要在theme中将主题设置为Theme.MaterialComponents.Light.NoActionBar,在MainActivity中加上代码:

  // 绑定并设置工具栏
  Toolbar toolbar = findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

然后放一个TextView显示文件路径,接着是最常用的ListView显示文件列表,最后是一个父标签为LinearLayout的布局,里面描绘了一个搜索框。
在这里插入图片描述

我们再看下自定义对话框的布局,应该一目了然,就是让用户输入文件名称,然后新建文件。
在这里插入图片描述

2、程序运行时申请权限

Android6.0以后需要在运行时申请读写外部存储的权限(危险权限)。首先在AndroidManifest.xml中加入我们需要的权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

运行时权限的核心在于程序运行过程中由用户授权我们去执行某些危险操作,程序是不可以擅自做主去执行这些危险操作的。因此,第一步就是先判断用户是不是已经给过我们授权了,借助的是ContextCompat.checkSelfPermission()方法。checkSelfPermission()方法接收两个参数,第一个参数是Context,也就是上下文,第二个参数是具体的权限名,比如读外存的权限名就是Manifest.permission.READ_EXTERNAL_STORAGE,然后我们使用方法的返回值和PackageManager.PERMISSION_GRANTED做比较,相等就说明用户已经授权,不等就表示用户没有授权。

如果已经授权的话就简单了,直接去执行查看文件的逻辑操作就可以了,我们把这部分操作封装到了initFile()方法当中。如果没有授权的话,则需要调用ActivityCompat.requestPermissions()方法来向用户申请权授权,requestPermissions()方法接收3个参数,第一个参数是Activity实例,第二个参数是一个String数组,第三个参数是请求码,只要是唯一值就可以了,这里传入了1。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int myPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (myPermission != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "请求读取SD卡权限", Toast.LENGTH_SHORT).show();
            // 动态申请权限,请求码为1
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        } else {
            initFile();
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 同意权限则初始化文件列表
                    initFile();
                } else {
                    // 拒绝权限
                    Toast.makeText(this, "你拒绝了读写SD卡权限", Toast.LENGTH_SHORT).show();
                    // 退出应用
                    finish();
                }
                break;
            default:
                break;
        }
    }

3、查看文件

当用户同意权限之后,先判断手机中是否装载了sd卡,如果有sd卡则获取SD卡的根目录,设置当前父目录为root,获取当前目录下的所有文件。然后for循环获取所有的文件的键值对,添加到列表中,再创建和设置适配器。就大功告成了。

    private void initFile() {
        // 判断手机中是否装载了sd卡
        boolean isLoadSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isLoadSDCard) {
            // 获取SD卡的根目录
            root = Environment.getExternalStorageDirectory();
            // 当前父目录为root
            currentParent = root;
            // 获取当前目录的所有文件
            currentFiles = currentParent.listFiles();
            // 加载列表
            inflatelv(currentFiles);
        } else {
            Toast.makeText(this, "SD卡没有被装载", Toast.LENGTH_SHORT).show();
        }
        // 设置列表子项监听器
        setListener();
    }

4、删除文件

对于文件夹而言,需要先删除目录下所有文件,然后删除当前文件夹;对于文件而言,直接删除当前文件。使用deleteFile()进行文件删除,接收参数为文件对象。在删除之后需要重新设置适配器。

   // 如果是文件夹先删除目录下所有文件
   if (!currentFiles[i].isFile()) {
       File[] files = currentFiles[i].listFiles();
       for (int index = 0; index < files.length; index++) {
           deleteFile(files[index].getName());
       }
   }
   // 删除当前文件(夹)
   if (currentFiles[i].delete()) {
       Toast.makeText(view.getContext(), "删除成功", Toast.LENGTH_SHORT).show();
       currentFiles = currentParent.listFiles();
       // 数据源发生改变,重新设置适配器内容
       inflatelv(currentFiles);
   }

5、搜索文件

搜索的原理很简单,就是关键词筛选,contains()方法判断是否包含关键词,将for循环得到的列表中每一个文件对象都放入File数组中,再重新设置适配器。

 // 搜索按钮进行数据筛选,显示关键词数据源
 ivSearch.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         String searchName = etSearch.getText().toString().trim();
         List<File> tempFiles = new ArrayList<>();
         for (int i = 0; i < currentFiles.length; i++) {
             if (currentFiles[i].getName().contains(searchName))
                 tempFiles.add(currentFiles[i]);
         }
         File[] files = new File[tempFiles.size()];
         for (int i = 0; i < tempFiles.size(); i++) {
             files[i] = tempFiles.get(i);
         }
         inflatelv(files);
     }
 });

6、新建文件

file.createNewFile()方法用来新建文件,file就是准备新建的文件对象;mkdir()方法用来创建文件夹,file就是准备新建的文件夹对象。调用File的构造方法,传入参数为文件路径。

   // 创建个新文件对象,参数为文件路径
   File file = new File(currentParent.getAbsolutePath() + "/" + filename);
   // 创建新文件夹
   file.mkdir();
   newBuildRefresh();
   alertDialog.dismiss();

四、运行演示

1、启动模拟器,运行app,进入应用首先会申请访问SD卡权限,如果拒绝将无法使用应用,选择允许进入应用。
在这里插入图片描述

2、可以看到屏幕中间显示SD卡的所有目录,当前路径为/storage/emulated/0。顶部工具栏左侧是应用名称,右侧是功能键,分别是返回上级菜单、返回根目录、新建目录;底部是搜索栏。
在这里插入图片描述

3、单击子项,如果是文件将提示“无法打开文件”;如果是文件夹:为空提示“文件夹为空”,不为空则进入下一级目录。这里我们进入了Picture目录。
在这里插入图片描述

4、长按子项,弹出对话框,点击确定即可删除文件或文件夹。
在这里插入图片描述

5、点击新建按钮,下拉菜单选择文件,输入文件名称,点击新建按钮,如果文件名重复会提示,不重复即可新建成功。
在这里插入图片描述
在这里插入图片描述

6、在搜索框输入test,点击搜索按钮,出现搜索结果。
在这里插入图片描述

7、点击搜索框的关闭按钮,清空搜索结果,显示原先的目录。
在这里插入图片描述

8、点击返回键返回到上级目录,也可以使用中间的根目录键直接返回根目录。如果当前是根目录,再次点击返回键就会退出应用。
在这里插入图片描述


🚀这有你错过的精彩内容🚀
Android Studio实现考试管理系统
Android Studio实现购物商城
Android Studio实现选课系统
Android Studio实现图书管理系统
Android Stduio实现外卖订餐系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【shell】shell编程之函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

分库分表如何处理主键ID

当关系型数据库数据量过大时&#xff0c;通常会采用分库分表降低数据库查表压力。分库分表有多种&#xff0c;有分一个库多张分表额&#xff0c;有分多个库多张表的。一般分库分表使用ShardingSphere分表&#xff0c;建分片键等。但是分库分表之后&#xff0c;主键ID如何处理呢…

Goby 漏洞更新 |Telesquare TLR-2005Ksh 路由器 getUsernamePassword 信息泄露漏洞

漏洞名称&#xff1a;Telesquare TLR-2005Ksh 路由器 getUsernamePassword 信息泄露漏洞 English Name&#xff1a;Telesquare TLR-2005Ksh getUsernamePassword Information Disclosure CVSS core: 9.0 影响资产数&#xff1a;25826 漏洞描述&#xff1a; Telesquare Tlr…

MATLAB--控制语句--数组操作--符号运算--绘图--文件和数据的处理

控制语句 MATLAB 常用的控制语句有for, while, if, switch 等。 一、循环语句 通过循环控制语句&#xff0c;可以重复执行代码块。循环有两类&#xff1a;for 循环和while 循环。 for 循环是一组语句重复固定的&#xff0c;指定的次数&#xff0c;while 循环是满足条件执行。…

【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

目录 前言http网络库组件介绍http网络库封装创建Har Module创建RequestOption 配置类创建HttpCore核心类创建HttpManager核心类对外组件导出添加网络权限 http网络库依赖和使用依赖http网络库&#xff08;httpLibrary&#xff09;使用http网络库&#xff08;httpLibrary&#x…

“虐人的”双亲委派机制

这些问题&#xff0c;看看你能回答上来多少个&#xff1a; 1、什么是双亲委派&#xff1f; 2、为什么需要双亲委派&#xff0c;不委派有什么问题&#xff1f; 3、”父加载器”和”子加载器”之间的关系是继承的吗&#xff1f; 4、双亲委派是怎么实现的&#xff1f; 5、我能不能…

国外空间服务器是否有利于SEO优化?

​  购买国外空间服务器&#xff0c;这是许多人在做网站时会考虑到的选择。在国内&#xff0c;由于网络环境和限制&#xff0c;所以选择国外的空间似乎是一个不错的选择。但是&#xff0c;国外空间服务器是否对SEO优化有影响?这是一个值得讨论的问题。 1.服务器响应速度 如果…

跟着LearnOpenGL学习4--着色器

文章目录 一、前言二、GLSL2.1、着色器结构2.2、数据类型2.2.1、向量 2.3、输入与输出2.4、uniform2.5、更多属性 三、着色器类 一、前言 在之前绘制三角形的博文中&#xff0c;我们已经接触到了着色器&#xff0c;但是肯定有许多疑问&#xff0c;本文来详细了解一下着色器&am…

【17】SCI易中期刊推荐——计算机信息系统电子与电气(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

Flink从入门到精通之-09状态编程

Flink从入门到精通之-09状态编程 Flink 处理机制的核心&#xff0c;就是“有状态的流式计算”。我们在之前的章节中也已经多次提到了“状态”&#xff08;state&#xff09;&#xff0c;不论是简单聚合、窗口聚合&#xff0c;还是处理函数的应用&#xff0c;都会有状态的身影出…

Spring Cloud第二季--Spring Cloud Bus

文章目录 Spring Clud Bus什么是总线基本原理 牛刀小试 Spring Clud Bus 在Spring Cloud学习–配置中心&#xff08;Config&#xff09;中实现了集中管理微服务配置、不同环境不同配置、运行期间也可动态调整、配置修改后可以自动更新的需求&#xff0c;但同时也有一个弊端&am…

服务器电源线:同为科技(TOWE)机房工程专用电源延长线

工程机房电源延长线 众所周知&#xff0c;世界上不同国家或地区所使用的插头、插座标准有所不同&#xff0c;在庞大复杂的数据中心计算集群内&#xff0c;需要电源供电才能正常工作&#xff0c;因此&#xff0c;服务器电源线是连接电源分配器和服务器的基本配件。在机房服务器…

如何通过优化服务器提升网站的SEO排名

在当今数字化时代&#xff0c;拥有一个高效、稳定的服务器对于网站的成功至关重要。然而&#xff0c;服务器不仅仅是为了提供网站的基本运行&#xff0c;它还可以对搜索引擎优化(SEO)起到关键作用&#xff0c;于是就有了多IP站群服务器这样对SEO非常友好的服务器。通过优化服务…

Goby 漏洞更新 |Telesquare TLR-2005Ksh 路由器 setSyncTimeHost 命令执行漏洞

漏洞名称&#xff1a;Telesquare TLR-2005Ksh 路由器 setSyncTimeHost 命令执行漏洞 English Name&#xff1a;Telesquare TLR-2005Ksh setSyncTimeHost RCE CVSS core: 9.8 影响资产数&#xff1a;25826 漏洞描述&#xff1a; Telesquare Tlr-2005Ksh是韩国Telesquare公司…

5月12日作业

作业1&#xff1a; 作业2&#xff1a;

make_shared知识点

背景 普通创建shared_ptr的方法如&#xff1a; shared_ptr<int> sp1(new int(11));sp1所开辟的动态内存分为如下两部分 uses是持有该资源shared_ptr数量&#xff0c;weaks表示持有该资源weak_ptr数量。 有可能出现 new int(10) 成功&#xff0c;但是引用计数 ref 的内…

应用程序服务器监控

什么是应用程序服务器监视 为了确保业务应用程序的最佳性能&#xff0c;必须使用应用程序服务器监视工具&#xff0c;以深入了解应用程序的运行状况和正常运行时间。应用程序服务器监视可帮助您识别性能不足的服务器组件以及性能问题的根本原因&#xff0c;修复它们并确保应用…

IDEA 导入 spring 源码

文章目录 前言一、下载源码二、安装 Gragle1. 下载 Gragle2. 配置环境变量 三、导入前准备四、编译源码1. 导入源码2. 我所遇见的问题 五、测试1. 创建 module2. 编写测试代码3. 我所遇到的问题 六、总结 前言 我们在学习 spring 源码的时候&#xff0c;有时候是需要在阅读源码…

【Linux Network】网络版计算器

目录 实验目标&#xff1a; 源代码&#xff1a; 实验结果&#xff1a; Linux网络编程✨ 实验目标&#xff1a; 制作一个应用层的简易版的计算器&#xff08;加、减、乘、除、取余&#xff09;&#xff1b; 源代码&#xff1a; makefile .PHONY:all all:CalClient CalServe…

国产仪器 6592A便携式高精度光伏电池伏安特性测试仪

6592A便携式高精度光伏电池伏安特性测试仪&#xff0c;主要用于室外太阳能电池阵列/组件/电池片伏安特性测试&#xff0c;能够方便、快速的测试太阳能电池阵列/组件/电池片在自然光照下的工作特性&#xff0c;可为太阳能电站设计、验收、维护提供测试保障&#xff0c;是电站建设…