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