Android Studio实现文件管理器

2023-05-16

项目目录

  • 一、项目概述
  • 二、开发环境
  • 三、详细设计
    • 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实现外卖订餐系统
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Studio实现文件管理器 的相关文章

  • QGC编译报错error C2220: 警告被视为错误 最佳解决方法

    前面搜了一下 xff0c 试过各种方法依然报错 xff0c 先整理别人的解决方法 目录 一 重新保存文件 二 xff0c 更改编码方式 三 最终解决方案 xff1a 修改配置文件 一 重新保存文件 注意这里的配置 Wx WX 二 xff0c
  • 整理px4飞控校准机制和qgc校准机制

    用qgc执行 px4飞控传感器校准时 的步骤确实很麻烦 xff0c 磁罗盘需要转6个面 xff0c 加速度计也需要6个面 大疆无人机的校准很简单 xff0c 加速度计需要静置一会 xff0c 磁罗盘校准也就转一个面就行了 xff0c 就算学
  • mavros操作飞机时方向位置改为机体坐标系下指令

    前面试了很多 xff0c 看官网里的说明 用 mavros setpoint raw local 34 里的frame id改为 34 base link 34 不行 又直接发mavros msgs PositionTarget 修改里面的
  • px4室内飞行通过SLAM发送位置消息

    先按照官方的教程设置好飞控参数 http docs px4 io master zh computer vision visual inertial odometry html 下载源码学习 xff1a https github com A
  • MCUXpresso调试FreeRTOS时显示多线程

    多线程程序调试起来确实麻烦 xff0c 在调试过程中默认只能看到当前线程 按照以下配置即可在程序暂停时查看多线程的状态 xff1a 在debug配置中选中下图所示 xff1a 配置完成后再调试程序即可显示多线程
  • px4 编译生成msg消息机制及将其移植方法

    目录 一 在px4中添加新的Topic 二 px4生成msg生成的结构体优势 三 msg生成工具及移植方法 一 在px4中添加新的Topic 在px4中是通过uorb进行消息的传递 xff0c 通过根目录下的msg文件可以添加自定义的消息
  • px4传感器数据sensor模块整理

    涉及传感器数据的流程 xff0c 大致整理如下图 传感器的数据从drivers中调用lib中dirvers对应的对象更新数据并发布出去 xff0c sensor模块通过订阅原始数据和校准参数 xff0c 对数据滤波并更正 xff0c 然后再
  • C#实现程序一次打开两个窗口,两个窗口分别放置在两个屏幕

    这是本人在编程中碰到的一个问题 xff0c 寻找了其他案例 xff0c 都只是同时打开两窗口 xff0c 但不能实现在拥有两块显示屏时候 xff0c 分别将两个不同的窗口显示在两个单独的屏幕 源代码https download csdn n
  • 探寻C#事件本质

    我最先在学习C 事件的时候 xff0c 阅读了许多书籍 xff0c 但总是不能对事件建立起一个比较清晰的概念 xff0c 对其内部机制和原理也是似是而非 xff0c 因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语 xff0c
  • C#chart绘折线图动态添加数据

    C 入门基础 xff0c 实现chart控件动态添加数据 源程序https download csdn net download qq 42237381 10742048 目录 一 效果示意 二 原理说明 三 代码参考 一 效果示意 最终程
  • C#Winform程序制作仿真地平仪,磁罗盘飞行仪表盘

    因为项目需要做一个电子飞行仪表盘包括地平仪和磁罗盘 xff0c 网上找了很久 xff0c 没有找到一个合适的控件 xff0c 就学习了一些图形处理的开源代码做一个简陋的仪表盘来使用 xff0c 希望对其他人有帮助 xff0c 如果有好的建议
  • pixhawk学习

    原文转载至https blog csdn net u013181595 article details 80976610 1硬件架构分析 Pixhawk是一款基于ARM芯片的32位开源飞控 xff0c 由ETH的computer visio
  • 由浅入深对卡尔曼滤波的学习

    原文来自http shequ dimianzhan com articles 337 extended kalman filter course from shallow to deep 搬运过来好好学习 本篇译文翻译自 The Exten
  • px4中mixer_multirotor.cpp混控程序解读

    目录 一 函数说明 二 具体步骤 1 简单混控无边界 无边界输出 不混合偏航 2 限幅 3 加入比例缩放和偏航 使输出范围限制在 0 1 4 融合怠速处理 一 函数说明 混控函数在MIX函数 MultirotorMixer mix floa
  • pixhawk飞控板基于px4程序中串口调试打印数据的方法

    px4程序模块化非常的清晰 但程序也是非常的庞大 不同于一般程序员的编程惯例 所谓程序入参出参直白明显 px4的程序大多采用全局变量 而且使用UORB的通讯 使程序调用非常方便 但是使程序的可读性降低了很多 没有花一定的时间去研读很难看懂程
  • 安装win10和Ubuntu双系统开机启动项问题总结

    补充一下 xff0c 前面这是几年前刚开始用双系统的写的博客 xff0c 经验少 xff0c 但也适用于新电脑安装快 xff0c 在老电脑上装ubuntu不用这么麻烦了直接看后面的 目录 新电脑 xff08 系统没啥东西 xff09 自动分
  • pixhawk飞控板添加额外pwm输出通道控制开伞或舵机转动实现功能

    学习大佬的文章 xff0c 贴图来用 https blog csdn net dai93 article details 89852241 这是输出流的大致示意 如果在飞控需要控制单独的舵机 xff0c 可以自定义一个pwm通道输出 xff
  • px4 实现发送自定义mavlink协议消息解锁飞控板以及切换飞行模式

    原理 xff1a 通过mavlink控制台可以执行命令 xff0c 在循环中调用控制台指令的函数就行了 查阅commander文件下 所有模式切换都在commder main函数 int commander main int argc ch
  • pixhawk配置垂直起降无人机

    我使用的版本里面没有找到 43 型尾座式垂直起降无人机 就先用x型无人机了 查看代码 发现在init d目录下id号为13003 待续
  • 关于def __init__(self)

    首先说明一下 xff0c def init self 是用于初始化类 但是我们实际程序阅读过程中会发现 xff0c 这部分经常有两种状况 1 def init self xff0c 不带参数 xff0c 此处借鉴另一位博主的程序做一下分析

随机推荐

  • 《机器学习》周志华 集成学习

    8 1个体集成 个体学习器可以由 C4 5决策树算法 BP神经网络等 来训练 个体学习器 同质 gt 叫基学习器 也叫弱学习器 指泛化性能略优于随机猜测的学习器 xff0c 如二分类问题上精度略高于50 的分类器 相应的算法叫做 基学习算法
  • 【Windows内核编程】Win10/Win11通过PspCidTable取得EProcess

    温馨提示 本文的内容均在Windows 11 Enterprise 22000 466 版本下测试 不同版本的部分内容可能存在差异 xff0c 但万变不离其中 Upadate 20220803 经测试 xff0c 本文内容目前向下兼容 正文
  • 自抗扰控制的入门学习(一)—— 前言

    自抗扰控制的入门学习 xff08 一 xff09 前言 与很多人一样 xff0c 接触这个算法之后心态也经历过 xff0c 从一开始的 不明觉厉 xff0c 中途的 不以为然 xff0c 到最后的 辩证看待 的演变过程 借用别人的话 xff
  • Qt中QMessageBox的用法---看这一篇就够了

    一 详细说明 QMessageBox类提供一个模态对话框 xff0c 用于通知用户或询问用户一个问题并接收答案 消息框显示一个主要文本 xff0c 用于向用户提示某个情况 显示一个信息文本 xff0c 用于进一步解释警报或向用户询问问题 显
  • CCM-SLAM代码阅读

    ClintNode cpp boost span class token operator span shared ptr span class token operator lt span cslam span class token o
  • 树莓派之无屏幕无路由器网线直连树莓派(二)

    经上篇博客安装好系统后 xff0c 先不要拔出SD卡 xff0c 因为树莓派默认不开启ssh xff0c 所以先打开SD卡在里面新建文件命名为 ssh xff08 一定要小写 xff09 xff0c 然后找到cmdline txt文件打开并
  • SQL Server无法连接到服务器的解决方法

    SQL Server连接失败如何解决 xff1f 楼主安装了两次数据库 xff0c 都是官网最新的2017 Developer版本的 SSMS安装的是最新的18 3 经历了各种失败之后成功连接数据库 下面总结几种实用的方法给大家 xff0c
  • Android Studio如何实现音乐播放器(简单易上手)

    我们大家平时长时间打代码的时候肯定会感到疲惫和乏味 xff0c 这个时候一边播放自己喜欢的音乐 xff0c 一边继续打代码 xff0c 心情自然也愉快很多 音乐带给人的听觉享受是无可比拟的 xff0c 动听的音乐可以愉悦人的身心 xff0c
  • 一分钟学会Python中pip的安装与使用

    文章目录 一 简单介绍二 下载安装三 最常用命令1 显示版本和路径2 获取帮助3 升级 pip4 安装包5 升级包6 卸载包7 搜索包8 显示安装包信息9 列出已安装的包10 查看指定包的详细信息 一 简单介绍 pip 是 Python 包
  • 不清楚SBUS,这份SBUS协议详解请收藏

    1 简介 SBUS xff0c 全称Serial Bus xff0c 即串行通信总线 本质上是一种串口通信协议 xff0c 采用100K的波特率 xff0c 8位数据位 xff0c 2位停止位 xff0c 偶效验 xff0c 即8E2的串口
  • IDEA 创建Servlet,HelloWorldServlet(图文并茂,超级详细)

    第一步 xff1a 创建一个空的新项目 xff0c File gt New gt Project Empty Project 第二步 xff1a 生成一个module xff0c 项目上点右键 xff0c New gt Moudle 或 F
  • 教你彻底卸载Ubuntu双系统,去污不残留

    我们卸载Ubuntu双系统 xff0c 可能出于以下原因 xff1a span class token number 1 span span class token class name Ubuntu span 系统内核损坏无法正常进入 s
  • Python安装Pytorch教程(图文详解)

    最近人工智能等多门课需要复现论文 xff0c 近两年的论文很多都是基于Pytorch环境做的实验 xff0c 所以 xff0c 这里总结一下Pytorch的安装教程 xff0c 做好最快 最简单 最好地完成安装 本机环境Win10 43 1
  • Win10安装Ubuntu18.04双系统,图文详解,全网最详细教程

    博主经历过多次双系统的安装与卸载 xff0c 所以这次安装就记录下全过程 xff0c 能让后面的同学少走弯路 本教程对笔记本电脑单硬盘和双硬盘通用 安装目录 一 查看电脑信息1 BIOS模式2 查看硬盘数 二 制作系统盘1 下载镜像源2 制
  • Ubuntu18.04安装Ceres,图文详解

    视觉SLAM14讲 的第6章里面 xff0c 用到了Ceres库 xff0c 按照本书3rdparty提供的资源编译时 xff0c 会报错 xff0c 原因是和eigen3版本发生冲突 网上很多解决方法是重装eigen xff0c 尝试后也
  • Ubuntu20.04部署yolov5目标检测算法,无人车/无人机应用

    在FireFly RK3588开发板上烧录了Ubuntu20 04系统 xff0c 在此基础上线部署下简单的Python版本yolov5代码 xff0c 目前博主已全部转为C 43 43 版本了 xff0c 并且转化了pt模型为rknn模型
  • ubuntu查看cpu使用率

    rk3588上安装的ubuntu系统 xff0c 规格书上是8核CPU xff0c 希望跑算法时使用4核来跑 xff0c 所以需要查看cpu的使用情况 输入gnome system monitor xff0c 开启进程界面 xff1a 点击
  • 【视觉SLAM】MonoRec: Semi-Supervised Dense Reconstruction in Dynamic Environments from a Single Moving C

    Citations xff1a F Wimbauer N Yang L von Stumberg et al MonoRec Semi Supervised Dense Reconstruction in Dynamic Environme
  • Win10蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

    最近一段时间 xff0c 我一直出现蓝屏的情况 xff0c 以为是 span class token constant CPU span 散热不行导致的重启 xff0c 因为比较频繁所以在此记录解决这个问题 xff0c 还是一贯的风格 xf
  • Android Studio实现文件管理器

    项目目录 一 项目概述二 开发环境三 详细设计1 布局设计2 程序运行时申请权限3 查看文件4 删除文件5 搜索文件6 新建文件 四 运行演示 一 项目概述 本次带来的文件管理器 xff0c 能够对SD卡的目录进行管理 主要功能包括新建文件