Android 更新/删除MediaStore文件的方法 看这一篇你就都懂了!

本文详细介绍了在Android系统中更新MediaStore数据库的方法,包括发送广播、操作MediaStore类及使用MediaScannerConnection类,其中后者被证实为稳定高效的方式。同时,文章提供了彻底删除MediaStore中文件的代码示例,确保不仅从数据库中移除文件索引,也从设备上删除源文件。

       开发中处理本地多媒体文件时经常会用到MediaStore,当程序从网络下载或其他途径生成一个新媒体文件到终端后,android手机系统的MediaScanner服务并不会自动扫描刚刚生成的文件,需要程序主动去扫描这些新添加的媒体文件信息到MediaStore数据库中。MediaStore,本质上是 Android 维护的一个文件系统的数据库,它记录了当前磁盘上所有的文件索引,我们可以通过它,快速的查找当前系统的文件。

 

一、更新MeidaStore

 

如何更新MediaStore呢?
通过分析源码得知:

①当系统启动完毕 会扫描一次(更新MediaStore数据库)
②当 ACTION_MEDIA_MOUNTED 或者 ACTION_MEDIA_SCANNER_SCAN_FILE 也会扫描(更新MediaStore数据库)
       

刷新系统 MediaStore通常有如下几种方式:

  • 通过操作 MediaStore 类。
  • 发送广播更新 MediaStore。
  • 通过操作 MediaScannerConnection 类。

 

通过研究实验,发 送广播更新  和 操作MediaStore,对于许多android机型是无效的

我们可以通过操作 MediaScannerConnection 类更新MediaStore,可以用以下代码请求特定文件的重新扫描。(稳定高效

注意:传递的MIME类型很重要。如果使用“*/*”,对MP3 ID3标记所做的更改不能在SQLite中正确刷新,但是使用“音频/mp3”是有效的。

  MediaScannerConnection.scanFile(
	mContext,
	new String[]{ "所需文件的绝对路径" },
	new String[]{  "video/mp4","audio/mp3" },
	new MediaScannerConnection.MediaScannerConnectionClient()
	{
		public void onMediaScannerConnected()
		{
		}
		public void onScanCompleted(String path, Uri uri)
		{
		}
	});

 

二、彻底删除MediaStore文件

当我们需要彻底删除MediaStore中的文件时,不仅要删除件文件索引还要删除源文件

删除工具类:

private void  deleteMedieFile(File file){
        if (file.isFile()) {
            String filePath = file.getPath();
            if(filePath.endsWith(".mp4")){
                int res = mContext.getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                        MediaStore.Audio.Media.DATA + "= \"" + filePath+"\"",
                        null);
                if (res>0){
                    file.delete();
                }else{
                    Log.e(TAG, "删除文件失败");
                }
            }else if (filePath.endsWith(".jpg")||filePath.endsWith(".png")||filePath.endsWith(".bmp")){
                int res = mContext.getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        MediaStore.Audio.Media.DATA + "= \"" + filePath+"\"",
                        null);
                if (res>0){
                    file.delete();
                }else{
                    Log.e(TAG, "删除文件失败");
                }
            }else{
                file.delete();
            }
            //删除多媒体数据库中的数据
            return;
        }

    }

 

<think> 我们参考了用户提供的三篇引用,并结合用户问题"Android Studio中File文件存储的用法"来组织答案。 引用[1]介绍了Device File Explorer的使用,引用[2]展示了保存文件到内部存储的代码示例,引用[3]则提供了Uri和File之间转换的方法。 根据用户问题,我们主要关注文件存储的使用方法,包括如何保存文件、读取文件以及相关工具的使用。 回答结构: 1. 介绍文件存储的基本概念和存储位置(内部存储和外部存储)。 2. 详细说明如何保存文件到内部存储(参考引用[2]示例)。 3. 说明如何从内部存储读取文件。 4. 简要介绍外部存储的使用(注意权限问题)。 5. 介绍Device File Explorer工具(参考引用[1])来查看设备上的文件。 6. 补充说明Uri和File之间的转换(参考引用[3])以适应某些需要Uri的API。 注意:我们使用行内数学表达式时用$...$,独立公式用$$...$$(但本问题可能不需要数学公式,因此可能不使用)。 生成相关问题。 </think> ### Android Studio中File文件存储的使用方法Android开发中,文件存储是数据持久化的基本方式之一。以下是详细使用方法及关键步骤: #### 📁 1. **文件存储位置** - **内部存储**:沙盒目录,路径为`data/data/<包名>/files/`,应用卸载时自动删除 - **外部存储**:SD卡目录`sdcard/`,需权限声明 > 注意:通过Device File Explorer可查看内部存储文件,但需开启USB调试或使用模拟器[^1] #### 💾 2. **保存文件到内部存储** 使用`Context.openFileOutput()`或`FileOutputStream`: ```java // 保存文本文件示例[^2] String filename = "data.txt"; String content = "Hello, World!"; try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) { fos.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` - `MODE_PRIVATE`:覆盖模式 - `MODE_APPEND`:追加模式 #### 📥 3. **读取内部存储文件** ```java try (FileInputStream fis = openFileInput(filename)) { InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line).append('\n'); } String fileContent = sb.toString(); } catch (IOException e) { e.printStackTrace(); } ``` #### 🌐 4. **外部存储操作(需权限)** - 声明权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` - 保存到公共目录: ```java File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), "myfile.txt"); // 写入操作同上 ``` #### 🔄 5. **Uri与File互转** ```java // File转Uri(适配Android 7.0+)[^3] Uri fileToUri(File file) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", file); } else { return Uri.fromFile(file); } } // Uri转File(通过MediaStore查询) File uriToFile(Uri uri) { String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, proj, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(proj[0]); cursor.moveToFirst(); String path = cursor.getString(column_index); cursor.close(); return new File(path); } return null; } ``` #### 🔍 6. **使用Device File Explorer验证** 1. 依次点击 **View > Tool Windows > Device File Explorer** 2. 选择设备后浏览: - 应用数据:`data/data/<包名>/files/` - SD卡文件:`sdcard/` 3. 支持右键操作:上传/下载/删除文件[^1] > ⚠️ **关键注意事项**: > - 内部存储无需权限,外部存储需动态申请权限 > - Android 7.0+ 使用`FileProvider`共享文件 > - 设备文件查看需开启`USB调试`或使用标准模拟器
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值