Android 删除文件

2023-10-26

代码逻辑实现

我这里就以“图片”为例,其他都差不多

一、首先是将数据给“查”出来

具体查询代码如下,因为主要讲的是删除,就不详细说了。
我自己自定义的对象:
1、mFilePaths 查询数据的列表
2、ImageObejct 一个简单的数据实力对象
3、mHandler Handler因为我这里的查询是异步的,需要Handler同步一下

private void queryImages(boolean isUpdate) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 先拿到图片数据表的uri
                Uri tableUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

                // 需要获取数据表中的哪几列信息
                String[] projection = new String[]{
                        MediaStore.Video.Media._ID,
                        MediaStore.Video.Media.DATA,
                        MediaStore.Video.Media.DISPLAY_NAME,
                        MediaStore.Video.Media.MIME_TYPE};
                // 查询条件,因为是查询全部图片,传null
                // String selection = MediaStore.Images.Media.DISPLAY_NAME +"= \'138309016372535042.png\'";
                // 条件参数 ,因为是查询全部图片,传null
                //String[] args = new String[] {“test”}
                // 排序:按id倒叙
                String order = MediaStore.Files.FileColumns._ID+" DESC";
                // 开始查询
                Cursor cursor = getContentResolver().query(tableUri,projection,null,null, order);

                if (mFilePaths == null || isUpdate){
                    mFilePaths = new ArrayList<>();
                }

                if (cursor != null) {
                    // 获取id字段是第几列,该方法最好在循环之前做好
                    int idIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
                    // 获取data字段是第几列,该方法最好在循环之前做好
                    int dataIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
                    int nameIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
                    int typeIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE);

                    while (cursor.moveToNext()) {
                        long id = cursor.getLong(idIndex);
                        // 获取到每张图片的绝对路径
                        String path = cursor.getString(dataIndex);
                        String name = cursor.getString(nameIndex);
                        String type = cursor.getString(typeIndex);
                        // 获取到每张图片的uri
                        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id);
                        // 后续工作
                        ImageObejct item = new ImageObejct(path,name,imageUri,id);
                        mFilePaths.add(item);
                    }

                    cursor.close();
                }

                Message msg = new Message();
                if (isUpdate){
                    msg.what = UPDATE_FILE_FINISH;
                }else{
                    msg.what = QUERY_FILE_FINISH;
                }
                mHandler.sendMessage(msg);
            }
        }).start();
    }

二、删除操作

删除的操作主要分为三步:

一、删除系统数据库表对应的索引
private void actionDeleteItem(ImageObejct item) {
 new Thread(new Runnable() {
     @Override
     public void run() {
         File file = new File(item.getPath());
         int flag = 0;
         if (file.isFile() && file.exists()) {
             String filePath = file.getPath();
             //筛选条件,相当于sql:where xx = ?
             String selectionClause = MediaStore.Images.Media.DATA + " = ?";
             //筛选参数,填充到筛选条件对应?处
             String[] selectionArgs = {filePath};

             int res = MainActivity.this.getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                     selectionClause,
                     selectionArgs);
             
             //delete的返回值是该操作所影响的行数,所以当res = 1,就是删除了一条记录,0 表示删除失败
             if (res>0){
                 file.delete();
                 flag = 1;
             }else{
                 showToast("actionDeleteItem 删除文件失败");
             }

             //删除多媒体数据库中的数据
         }
		
         Message msg = new Message();
         msg.what = DELETE_FILE_FINISH;
         msg.arg1 = flag;
         msg.obj = file.getPath();
         mHandler.sendMessage(msg);
     }
 }).start();
}
二、删除成功后需要更新MediaStore,不然下次查出来的数据有发现怎么删除了的还在
private void updateMediaStore(String filePath) {
  MediaScannerConnection.scanFile(MainActivity.this ,
          new String[]{filePath}, null,
          new MediaScannerConnection.OnScanCompletedListener() {
              public void onScanCompleted(String path, Uri uri) {
              	//更新完后再判读一次是否已经删除
                  if (!TextUtils.isEmpty(path)){
                      File file = new File(path);
                      if (file.exists()){
                          showToast("updateMediaStore 删除失败");
                      }else {
                          showToast("updateMediaStore 删除成功");
                      }
                  }
              }
          });
}
三、(根据个人需求)重新查一遍数据,更新数据列表

查的代码上面已经展示,这里不再展示,这里是更新界面数据的逻辑。

private void upListDate() {
    if (mFilePaths != null && mFilePaths.size()>0){
        mFileListAdapter.setFilePaths(mFilePaths);
        mFileListAdapter.notifyDataSetChanged();

        loaddingFinish();
    }else {
        loaddingFail();
    }
}

注意事项

权限

作为一个删除功能,肯定不能少的读写权限。

//Android 6及之后的版本
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

//Android 10及之后还需要在<application>中添加
//不使用 强制分区
android:requestLegacyExternalStorage="true"

//Android 11及之后必须强制分区
//获取 所有文件的控制权限,需要引导用户手动打开权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 删除文件 的相关文章

  • 如何从属性中获取枚举值

    我有一个带有值的枚举VALID and INVALID 它们有一个与之关联的布尔属性 我想根据我提供的布尔值获取枚举值 如果是true我应该得到VALID 如果是false我应该得到INVALID 我想根据成员变量的值 在如下所示的 get
  • 如何提高加速度计和指南针传感器的精度?

    我正在创建一个增强现实应用程序 当手机面向兴趣点 GPS 位置存储在手机上 时 它可以简单地可视化文本视图 文本视图绘制在屏幕中的兴趣点位置上 它工作正常 问题是指南针和加速度计非常 变体 并且文本视图由于传感器的准确性而不断左右上下移动
  • 将一组 Java 对象转换为另一组对象的最佳方式是什么?

    这是一个真正的新手提出的基本 Java 问题 我有一组实现某个接口 接口 MyIfc 的Java对象 属于 MyClass 类 我有一组这些对象存储在我的类中的私有变量中 声明如下 protected Set
  • 按下后退按钮时停止 Fragments 中的 AsyncTask

    我有一个托管片段的活动 按下按钮会通过 FragmentTransaction 从片段 A 转到片段 B 并将其添加到返回堆栈中 现在片段 B 有一个 AsyncTask 实现 它从 sdcard 加载图像并在加载图像时将其发布 如果我按
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • 从文件执行db语句

    我在我的应用程序中使用嵌入式 Apache derby 我有一个名为的 SQL 脚本创建的数据库 sql创建数据库中的所有表并用初始数据填充它 例如 SET SCHEMA APP CREATE TABLE study study id bi
  • 如何在 Spring Boot 中跳过将某些 @Entity 类创建为 h2(内存中)数据库中的表?

    我正在尝试构建一个使用 2 个数据源的 Spring Boot 应用程序 我现在的主要数据库是内存数据库 仅用于测试目的 其中的表是在我创建的 sql 文件的帮助下填充的 另一个数据库 oracledb 具有已填充的表 我想实现什么目标 我
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 序列化/反序列化 LinkedHashMap (android) java

    所以我想将 LinkedHashMap 传递给意图 SEND THE MAP Intent singlechannel new Intent getBaseContext singlechannel class singlechannel
  • Intent.ACTION_DIAL 号码以 # 结尾

    所以我尝试通过以下方式发送号码Intent ACTION DIAL以 结尾 例如 123 但是当Android Dialer应用程序启动时 只有 123 不见了 我正在使用以下代码来触发 Android 的拨号应用程序 Uri number
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • 如何在 Java 中以编程方式获取接口的所有实现的列表?

    我可以通过反思或类似的方式来做到这一点吗 我已经搜索了一段时间 似乎有不同的方法 这里总结一下 反思 https github com ronmamo reflections如果您不介意添加依赖项 该库非常受欢迎 它看起来像这样 Refle
  • Google Play Services V2 库中的 NoClassDefFoundError

    在按照以下步骤尝试使用 Google Play Services V2 库时 出现以下异常官方教程 https developers google com maps documentation android start java lang
  • 在 Firebase 中获取用户名、姓氏和 ID

    我使用 firebase 创建了登录 注册 并且工作正常 但我需要从用户那里获取姓名 我怎样才能做到这一点 我想知道是否可以从用户那里获取 ID 因为我想在我的应用程序中创建一个排名页面 因此只有 ID 才是唯一的 要获取唯一 ID 您可以
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • 执行选项卡切换时避免重新创建相同的视图

    目前 我有 2Fragments 可通过以下方式切换ActionBar s tab getSupportActionBar setNavigationMode ActionBar NAVIGATION MODE TABS ActionBar
  • 如何防止LRU缓存android中的内存不足错误

    我在我的 Android 应用程序中使用内存 LRU 缓存来缓存位图 但是在将某些位图加载到 LRU 映射中后 应用程序强制关闭并提示内存不足异常 我花了一整天的时间 但还没有找到解决方案 请任何人都可以帮助我 我严重陷入这个问题 提前致谢
  • ViewPager 中的 PagerTabStrip 位置

    我有以下代码
  • Phonegap - 自动包含正确的科尔多瓦

    我正在 iOS 和 Android 上开发一个 PhoneGap 应用程序 并使用 git 控制我的 www 目录版本 我知道我的 HTML 文件需要包含正确的 Cordova js 文件 取决于我当前正在开发的平台 当有人在 Androi
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h

随机推荐

  • 使用 Skeleton Screen 提升用户感知体验

    1024程序猿节 愿世界和平 没有bug 腾讯云社区向改变世界的程序猿致敬 作者 陈纬杰 一直以来 无论是web还是iOS android的应用中 为了提升应用的加载等待这段时间的用户感知体验 各种奇门遁甲之术层出不穷 其中 菊花图以及由它
  • 【满分】【华为OD机试真题2023 JAVA&JS】硬件产品销售方案

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 硬件产品销售方案 知识点递归数组DFS搜索回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某公司目前推出了AI开发者套件 AI加速卡 AI加速模块 AI服务
  • 可以改动的option组件_MySQL的validate_password插件/组件总结

    Password Validation插件和组件 在MySQL 8 0之前 MySQL使用的是validate password插件 plugin 检测 验证账号密码强度 保障账号的安全性 而到了MySQL 8 0 引入了服务器组件 Com
  • c高级 day4

    实现一个对数组求和的函数 数组通过实参传递给函数 bin bash read p 请输入数组 a arr function sum sum 0 for i in arr do sum sum i done echo 数组和 sum sum
  • ubuntu nginx服务器安装SSL证书

    证书安装 前往 SSL 证书管理控制台中下载 SSL 证书 名称以 bdjw work 为例 文件压缩包 并解压到本地目录 解压缩后 可获得相关类型的证书文件 文件内容 bdjw work bundle crt 证书 bdjw work k
  • MySQL 高级原理: MySQL执行过程及执行顺序

    一 MySQL执行过程 MySQL整体的执行过程如下图所示 1 1 连接器 1 1 1连接器的主要职责 1 负责与客户端的通信 是半双工模式 这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据 而不能同时进行 其中My
  • 文件的打开与关闭

    对于文件的打开与关闭 我们可以通过鼠标来控制 但是 在我们写代码的时候 总不能来用鼠标来打开关闭文件 并且还能将代码放在那个文件里面吧 因此 我们需要一个文件指针来帮助我们来打开和关闭文件 1 文件指针 缓冲文件系统中 关键的概念是 文件类
  • Ubuntu命令行修改网络配置,静态ip,hostname ,解决hostname ping不通的办法

    打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo vi etc network interfaces 并用下
  • Ms08067漏洞复现

    Ms08067漏洞复现 首先安装好测试环境xp的镜像文件 nmap扫描 首先确定靶机所在的网段 然后在kali中利用命令扫描出IP nmap sP 192 168 229 0 24 得到 IP 192 168 229 168 其次在利用nm
  • 字节、字、位、比特的概念和关系

    1 位 bit 来自英文bit 音译为 比特 表示二进制位 位是计算机内部数据储存的最小单位 11010100是一个8位二进制数 一个二进制位只可以表示0和1两种状态 21 两个二进制位可以表示00 01 10 11四种 22 状态 三位二
  • 如何避免服务器被恶意网络攻击

    服务器的IP是可公开透明的 很容易遭到黑客入侵或网络攻击 对服务器的恶意网络行为包括两个方面 首先是恶意的攻击行为 如DDoS攻击 网络病毒等等 这些行为旨在消耗服务器资源 影响服务器的正常运作 甚至服务器所在网络的瘫痪 另外一个就是恶意的
  • STM8L151的IAR工程编译报错Fatal Error[Pe035]: #error directive: “Please select first the target STM8L...

    项目场景 STM8L151G4XX单片机IAR工程编译报错 问题描述 编译报错 Fatal Error Pe035 error directive Please select first the target STM8L device us
  • token的使用流程以及 JWT构成和构建

    1 什么是token token是一个令牌 是前后端开发时的一个验证工具 就是一个字符串 我们先解释一下他的含义 1 Token的引入 Token是在客户端频繁向服务端请求数据 服务端频繁的去数据库查询用户名和密码并进行对比 判断用户名和密
  • Linux的诞生和发展&开源模式的流行

    Linux的诞生和发展 Linux的诞生 1991年最初由Linus Torvalds针对386 个人计算机 开发 Linus Torvalds那时是芬兰的一名研究生 20世纪80年代 计算机硬件的性能不断提高 PC的市场不断扩大 当时可供
  • axivion和astree_Axivion架构分析及验证工具

    德国Axivion公司 德国Axivion 公司是一家完全自主的技术公司 公司保持持续增长 在软件开发解决方案领域拥有超过10年的经验 作为源于斯图加特大学的公司 Axivion公司提供了一个良好的学术背景 开发专业完整的解决方案 以确保软
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 只要这铃声响起 100个人得有10个人掏出手机看看 当之无愧的山寨歌王 当IPhone变成街机 出厂铃声数量不多 铃声总是撞车 DIY个性铃声很有必要的 只要不选择 月亮之上 就没问题 IPhone设置铃声的方
  • IDEA 打war包部署时子模块jar包没依赖上

    使用IDEA在tomcat中部署maven多模块时出现的一个莫名的bug 首先在server中打印下 可以看见 context startup failed due to previous error see server log for
  • <Python>PyQt5,多窗口之间参数传递和函数调用

    PyQt5的多窗口之间参数如何传递 函数如何调用 之前在学习PyQt5的过程中 试着自己编写一个音乐播放器 基本功能实现后 希望添加一个独立的播放列表 然后实现播放列表和播放主界面之间的函数调用 双击播放列表的歌曲 主窗口播放歌曲 这虽然是
  • 数据库应用:MySQL高级语句(三)存储过程

    目录 一 理论 1 存储过程 2 存储过程操作 3 存储过程的参数 4 存储过程的控制语句 二 实验 1 创建和调用存储过程 编辑 编辑 2 存储过程的参数 3 存储过程的控制语句 三 总结 一 理论 1 存储过程 1 概念 存储过程是一组
  • Android 删除文件

    删除文件 代码逻辑实现 一 首先是将数据给 查 出来 二 删除操作 一 删除系统数据库表对应的索引 二 删除成功后需要更新MediaStore 不然下次查出来的数据有发现怎么删除了的还在 三 根据个人需求 重新查一遍数据 更新数据列表 注意