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函数进行更新;

时间: 2024-12-09 12:24:10

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

浅析Android文件管理器(项目一)_Android

文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能,如网络连接.应用程序管理.存档和压缩处理.搜索等. 今晚就写了res下面那些文件,因为在编写逻辑的时候如果资源文件夹没有的话,会非常的苦恼的.所以学习的时候总是会先把资源编写完毕,再开始编写逻辑. 然后我自己也总结一下今晚学了什么吧. IDE : Android Studio 惯例,上代码. 先是

浅析Android文件管理器(项目一)

文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能,如网络连接.应用程序管理.存档和压缩处理.搜索等. 今晚就写了res下面那些文件,因为在编写逻辑的时候如果资源文件夹没有的话,会非常的苦恼的.所以学习的时候总是会先把资源编写完毕,再开始编写逻辑. 然后我自己也总结一下今晚学了什么吧. IDE : Android Studio 惯例,上代码. 先是

android文件管理器用法详解

很久没有写东西了,鉴于某某同学文件管理器不会,这里简单介绍一下,同时写一个demon,参考了网上别人写的代码,自己也学习学习,研究研究. 首先所谓文件管理器,看起来就是一个列表,列表里面是文件夹或者文件,首先把布局写出来,我想在最上方的左边显示文件的路径,右边显示该路径下的文件个数,其实还是一个遍历文件,然后用列表显示出来的问题.下面是ListView,用来显示文件列表.下面是运行的效果图: 主界面的布局文件如下: <?xml version="1.0" encoding=&qu

android 文件管理器-请问在编写android文件管理程序时,存在文件和文件夹同名问题的处理?

问题描述 请问在编写android文件管理程序时,存在文件和文件夹同名问题的处理? 在重命名"文件夹"时,在同一目录下存在同名的"文件",应该怎么处理,谢谢各位大神! 解决方案 删掉就可以了,在不行就刷机.

文件管理器-android 复制大量文件,显示进度

问题描述 android 复制大量文件,显示进度 我在做一个android文件管理器,需要复制文件,我在子线程中执行,使用了Progress ,但是我不知道如何设置当前进度,以及总进度,我想通过文件的大小,但是怎获取已经复制的文件的大小呢,假如说一个大视频文件,视频文件的大小作为总进度,可以如何获取当前进度 解决方案 进度类有相关的方法,详细看一下

Android开发之简单文件管理器实现方法_Android

本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下: 这里运用Java I/O.ListActivity.Dialog.Bitmap等实现简单文件管理器,可以查看目录文件,修改文件名,删除文件,打开文件.比较简单,直接看代码: 先看布局文件: layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&q

android简易文件管理器实例(列表式文件目录)

核心代码: File fatherFile = new File(path);File[] files = fatherFile.listFiles(); 效果图: 实现这种列表式的目录,用直接读取目录下文件方法会比较简单,但是如果要根据文件类型从所有文件中分类,那就用ContentProvider去查询数据库方式会更有效率: 实现代码: FileListActivity.java package com.example.d_readandwritetextfile; import java.i

HD文件管理器 v0.1.3----- 一款界面简约,功能强大的免费文件管理器(Android)

Android平台上具有完整功能的文件管理,漂亮的UI界面设计以及良好的用户体验. 支持android 1.5及以上平台 包括: * 将Linux平台上最流行的图标集之一 Faenza 作为文件管理器的图标集 * 针对30多种不同文件类型显示不同的图标 * 剪切,复制,粘帖功能 * 创建文件夹功能 * 显示或者隐藏文件 * 支持列表方式进行文件浏览 * 支持显示 APK 图标 * 支持手机上的快捷键 * 支持"图标模式"和"列表模式"浏览 关键词: 文件管理器,文件

android开发之文件管理器

问题描述 android开发之文件管理器 android开发之如何调用系统文件管理器跳转到sd卡指定目录?