读书人

android 传媒数据库刷新

发布时间: 2013-04-12 18:33:12 作者: rapoo

android 媒体数据库刷新

android在启动的时候会启动MediaScannerService扫描系统上的多媒体文件,然后将这些多媒体文件的信息加入到多媒体数据库中,应用程序要取得这些多媒体信息就是从这个多媒体数据库里面去取的,并不是从SD卡中取。也就是说,如果开机后增加或删除了一些多媒体,这个多媒体数据库是不会自动刷新的。android提供了两个Intent来发广播让系统自动刷新多媒体数据库,分别是Intent.ACTION_MEDIA_MOUNTED和Intent.Action_MEDIA_SCANNER_SCAN_FILE,前面的是扫描整个SD卡,后面的针对某个文件进行扫描,发了Intent.ACTION_MEDIA_MOUNTED这个广播后,还可以通过广播接收器监听ACTION_MEDIA_SCAN_STARTED和ACTION_MEDAI_SCAN_FINISH这两个广播,分别是开始扫描和扫描完毕时系统发出的。进行全卡扫描的话需要3-5秒的时间(我的情况),针对某个文件扫描的没有试过,呵呵,懒了。最近DLNA的DMC需要用到刷新媒体库的功能,不然之前一直是要是添加了新的文件,就重启手机,晕死了。网上搜索了一趟,很多都是建议:

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,                Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath())));

可是我试了之后发现,每当我增加或减少了多媒体文件后,我的整个音乐列表都不见了,不知道是哪里出了原因。后来参考了以下两位的做法,终于把功能实现了:http://www.cnblogs.com/tanlon/archive/2011/09/06/2169302.html  和 http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=36475

我的具体实现是:

public class MainActivity extends Activity {private MediaScannerConnection mediaScanConn = null;private MusicSannerClient client = null;private File filePath = null;private String fileType = null;@SuppressLint("SdCardPath")@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);client = new MusicSannerClient();mediaScanConn = new MediaScannerConnection(this, client);scanfile(new File("/sdcard"));}class MusicSannerClient implementsMediaScannerConnection.MediaScannerConnectionClient {public void onMediaScannerConnected() {Log.e("---------", "media service connected");if (filePath != null) {if (filePath.isDirectory()) {File[] files = filePath.listFiles();if (files != null) {for (int i = 0; i < files.length; i++) {if (files[i].isDirectory())scanfile(files[i]);else {mediaScanConn.scanFile(files[i].getAbsolutePath(), fileType);}}}}}filePath = null;fileType = null;}public void onScanCompleted(String path, Uri uri) {// TODO Auto-generated method stubmediaScanConn.disconnect();}}private void scanfile(File f) {this.filePath = f;mediaScanConn.connect();}}


2楼Joyce_Qin_1986昨天 15:57
[code=java]nsendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, n Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()))); n[/code]n的做法会导致音乐列表变空了,是因为我有的歌曲名字里面包含了特殊字符,比如&,不管是用这种做法还是后面的做法,都会出现这个问题。头疼啊
1楼Joyce_Qin_1986昨天 19:22
问题解决了。最终还是用了发广播的方法让系统自己取扫描多媒体,因为我发现自己编的方法在增加文件的时候可以刷新进去,可是删除一些文件后,媒体库里面还存在被删除文件的信息。至于特殊字符&,针对它进行了转义就行了,转为 & 是包含了分号;的五个字符。转义的时候用string.replace("&","&") 发现竟然是不行了,后来把整个字符串拆了再拼接起来才可以。
Re: Joyce_Qin_1986昨天 13:25
回复Joyce_Qin_1986n发广播的方法等扫描完太久了,Nexus竟然要20秒,完全不能忍受啊,怎么搞
Re: Joyce_Qin_1986昨天 15:56
回复Joyce_Qin_1986nNexus 7 ,Nexus 4也好久,不过没7久。小米倒是挺快,5秒

读书人网 >其他数据库

热点推荐