Android 更新/删除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;
        }

    }

 

Android 11 (API 级别 30) 及以上版本中,为了保护用户的隐私和数据安全,Android 增强了对应用程序访问存储空间的限制。在应用程序中,如果需要访问存储空间中的文件,需要使用 MediaStore API 来进行操作。以下是使用 MediaStore API 重命名存储空间(storage/emulated/0/DCIM)路径下的文件的示例代码: ```java ContentResolver resolver = getContentResolver(); String oldFilePath = "/storage/emulated/0/DCIM/old_file_name.jpg"; String newFilePath = "/storage/emulated/0/DCIM/new_file_name.jpg"; Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; String selection = MediaStore.Images.Media.DATA + "=?"; String[] selectionArgs = new String[] { oldFilePath }; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, newFilePath); int rows = resolver.update(uri, values, selection, selectionArgs); if (rows > 0) { // 重命名成功 } else { // 重命名失败 } ``` 其中,resolver 表示 ContentResolver 对象,oldFilePath 表示原文件的路径,newFilePath 表示新文件的路径。首先,使用 ContentResolver.query() 方法来查询存储空间中原文件对应的 Uri,然后使用 ContentResolver.update() 方法更新该 Uri 对应的文件名,该方法返回一个 int 类型的值,表示更新的行数。如果更新成功,则 oldFilePath 对应的文件名会被修改为 newFilePath 对应的文件名,否则文件名不变。 需要注意的是,为了访问存储空间中的文件,需要在 AndroidManifest.xml 文件中添加如下权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 同时,在 Android 10 (API 级别 29) 及以上版本中,需要在 AndroidManifest.xml 文件中添加如下代码,以保证应用程序能在后台访问存储空间: ```xml <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> ``` 另外,需要注意的是,对于存储空间中的文件,如果用户使用了其他应用程序进行编辑或删除等操作,那么该文件对应的 Uri 也会发生相应的变化,因此在使用 MediaStore API 操作文件时需要特别注意。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值