Android文件管理器与media数据库的同步问题

Android文件管理器与media数据库的同步问题
http://www.eoeandroid.com/thread-112212-1-1.html


Bug Description:
当在文件管理器中修改多媒体文件(包含音乐、视频、图片)后,音乐播放器、视频播放器、gallery app中显示被修改的文件,且打开失败。Android Recorder(录音机)也出现相同问题。
Root Cause:
Android系统自带了一个media数据库,每次开机完成后,系统会自动扫描SD卡和系统并将音乐、视频、图片三类多媒体文件存放到media数据库中对应的表中。当打开对应APP时,APP会从media数据库中查询对应的文件,并显示给用户。此问题原因在于,文件文件管理器修改的文件没有同步到media数据库中,导致APP不能得到最新的文件数据。
Solution:
文件管理器每次修改多媒体文件时,都要将其修改同步到数据库中。

同步方法:

1.  添加文件
当添加一个文件后,可发送ACTION_MEDIA_SCANNER_SCAN_FIL的广播,MediaProvider捕获到这个广播后,就会扫描添加的文件并将其添加到数据库中。
参考代码:
private void notyfyMediaAdd(File file){
                if(file.isDirectory()) {
                        File[] children = file.listFiles();
                        for (File child : children) {
                                notyfyMediaAdd(child);
                        }
                        return;
                }
                
                String type = "";
                type = FileUtilMsg.getFileMimeType(file);
                
                if(type.startsWith("audio/")
                                || type.startsWith("video/")
                                || type.startsWith("image/")
                                || type.equals("application/ogg")
                                || type.equals("application/x-ogg")
                                || type.equals("application/itunes")) {
                        String uriStr = file.getAbsolutePath().replaceFirst(".*/?sdcard", "file:///mnt/sdcard");
                        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(uriStr)));
                }
        }


2.        删除文件
直接调用MediaProvider的delete函数进行删除。
参考代码:
private void notifyMediaRemove(File file){
                String type = "", where = "";
                type = FileUtilMsg.getFileMimeType(file);
                
                String path = file.getAbsolutePath().replaceFirst(".*/?sdcard", "/mnt/sdcard");
                
                if(type.equals("")) {
                        where = MediaStore.Audio.Media.DATA + " LIKE '" + path + "%'"; 
                        getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                        where = MediaStore.Video.Media.DATA + " LIKE '" + path + "%'"; 
                        getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                        where = MediaStore.Images.Media.DATA + " LIKE '" + path + "%'"; 
                        getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                        return;
                }
                
                if(type.startsWith("audio/")
                                || type.equals("application/ogg")
                                || type.equals("application/x-ogg")
                                || type.equals("application/itunes")) {
                        where = MediaStore.Audio.Media.DATA + "='" + path + "'"; 
                        getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                } else if(type.startsWith("video/")) {
                        where = MediaStore.Video.Media.DATA + "='" + path + "'"; 
                        getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                } else if(type.startsWith("image/")) {
                        where = MediaStore.Images.Media.DATA + "='" + path + "'"; 
                        getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, where, null);
                        
                }
                
        }

3.        更新文件:移动、重命名  
可以先删除原文件,再添加新文件来进行更新。
参考代码:
  调用上述删除和添加的函数。
也可以直接调用MediaProvider的update函数进行更新;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值