Android文件管理器与media数据库的同步问题
来源:互联网 发布:windows获得system 编辑:程序博客网 时间:2024/05/17 20:56
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函数进行更新;
- Android文件管理器与media数据库的同步问题
- Android文件管理器与media数据库的同步问题
- Android文件管理器与media数据库的同步问题
- 文件管理器和mediastore数据库同步过程中出现的问题
- sap 同步jco与外部数据库数据同步的问题
- android文件管理器开发中遇到的一些问题
- Android中同步与异步的问题
- MSSQL数据库同步的方法--使用企业管理器
- 关于客户端与数据库服务器端的时间同步问题
- 关于客户端与数据库服务器端的时间同步问题
- MySQL数据库主从同步存在问题的分析与学习
- Redis与关系型数据库的同步问题
- 实现KTV效果:播放歌曲,录音(存储录音文件),并同步播放录音 & 解释4.3以上audio与media资源冲突问题
- Android 文件管理器 Android文件管理器源代码
- android 简单文件管理器的实现
- android 平台优秀的文件管理器
- android文件管理器的源码实现
- android 文件管理器的源码实现
- Linux进程间通信(IPC)
- 计算最大公因数的欧几里德算法
- 《大话设计模式》之--第7章 为别人做嫁衣----代理模式
- LISP 简单的数据库 3.3 查看数据库内容
- python speech recognition 声音识别
- Android文件管理器与media数据库的同步问题
- 《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
- MFC:Tab Control 控件的使用
- 《大话设计模式》之--第9章 简历复印----原型模式
- 《大话设计模式》之--第10章 考题抄错会做也白搭----模板方法模式
- 《大话设计模式》之--第11章 无熟人难办事?----迪米特法则
- 《大话设计模式》之--第12章 牛市股票还会亏钱?----外观模式
- 《大话设计模式》之--第13章 好菜每回味不同----建造者模式
- 《大话设计模式》之--第14章 老板回来,我不知道----观察者模式