如何接受 sdcard是什么文件夹中内容发生变化的广播

摘要:   在上一篇随笔中,我介绍了如何在程序中查询sdcard内的多媒体文件,并且显示到播放列表中,但是,如果在sdcard内删除、增加一些多媒体文件,如何让播放列表也更新呢,这里我分享一下自己在项目中的一些解决方法, ...
  在上一篇随笔中,我介绍了如何在程序中查询sdcard内的多媒体文件,并且显示到播放列表中,但是,如果在sdcard内删除、增加一些多媒体文件,如何让播放列表也更新呢,这里我分享一下自己在项目中的一些解决方法,希望对大家有所帮助。                                     
  当android的系统启动的时候,系统会自动扫描sdcard内的多媒体文件,并把获得的信息保存在一个系统数据库中,以后在其他程序中如果想要访问多媒体文件的信息,其实就是在这个数据库中进行的,而不是直接去sdcard中取,理解了这一点以后,问题也随着而来:如果我在开机状态下在sdcard内增加、删除一些多媒体文件,系统会不会自动扫描一次呢?答案是否定的,也就是说,当你改变sdcard内的多媒体文件时,保存多媒体信息的系统数据库文件是不会动态更新的。
  那么如何让多媒体数据库中的数据更新呢?我们可以采用广播机制来实现:在应用程序中发送一个广播,让扫描sdcard并更新多媒体数据库        
private void scanSdCard(){&
&&&&&& IntentFilter intentfilter = new IntentFilter( Intent.ACTION_MEDIA_SCANNER_STARTED);&
&&&&&& intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);&
&&&&&& intentfilter.addDataScheme(&file&);&
&&&&&& scanSdReceiver = new ScanSdReceiver();&
&&&&&& registerReceiver(scanSdReceiver, intentfilter);&
&&&&&& sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,&
&&&&&&&&&&&&&& Uri.parse(&file://& + Environment.getExternalStorageDirectory().getAbsolutePath())));
view sourceprint?}
  其中红色标记的部分,ScanSdReceiver是一个自定义的广播接收器,继承自BroadCastReceiver,因为android系统开始扫描sdcard以及扫描完毕时都会发送一个系统广播来表示当前扫描的状态,这样我们就可以很方便通过判断当前的扫描状态加一些自己的逻辑操作,ScanSdReceiver的代码如下:
public class ScanSdReceiver extends BroadcastReceiver {&
&&& private AlertDialog.Builder& builder =&
&&& private AlertDialog ad =&
&&& private int count1;&
&&& private int count2;&
&&& @Override&
&&& public void onReceive(Context context, Intent intent) {&
&&&&&&& String action = intent.getAction();&
&&&&&&& if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)){&
&&&&&&&&&&& Cursor c1 = context.getContentResolver()&
&&&&&&&&&&& .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,&
&&&&&&&&&&&&&&&&&&& new String[]{MediaStore.Audio.Media.TITLE,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.DURATION,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.ARTIST,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media._ID,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.DISPLAY_NAME },&
&&&&&&&&&&&&&&&&&&& null, null, null);&
&&&&&&&&&&& count1 = c1.getCount();&
&&&&&&&&&&& System.out.println(&count:&+count);&
&&&&&&&&&&& builder = new AlertDialog.Builder(context);&
&&&&&&&&&&& builder.setMessage(&正在扫描存储卡...&);&
&&&&&&&&&&& ad = builder.create();&
&&&&&&&&&&& ad.show();&
&&&&&&& }else if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){&
&&&&&&&&&&& Cursor c2 = context.getContentResolver()&
&&&&&&&&&&& .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,&
&&&&&&&&&&&&&&&&&&& new String[]{MediaStore.Audio.Media.TITLE,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.DURATION,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.ARTIST,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media._ID,&
&&&&&&&&&&&&&&&&&&& MediaStore.Audio.Media.DISPLAY_NAME },&
&&&&&&&&&&&&&&&&&&& null, null, null);&
&&&&&&&&&&& count2 = c2.getCount();&
&&&&&&&&&&& count = count2-count1;&
&&&&&&&&&&& ad.cancel();&
&&&&&&&&&&& if (count&=0){&
&&&&&&&&&&&&&&& Toast.makeText(context, &共增加& +&&
&&&&&&&&&&&&&&&&&&&&&&& count + &首歌曲&, Toast.LENGTH_LONG).show();&
&&&&&&&&&&& } else {&
&&&&&&&&&&&&&&& Toast.makeText(context, &共减少& +&
&&&&&&&&&&&&&&&&&&&&&&& count + &首歌曲&, Toast.LENGTH_LONG).show();&
&&&&&&&&&&& }&&&&
&&&&&&& }&&&&
  这里我们定义了两个Cursor对象,分别用来存储扫描前后的多媒体信息,并给出相应的提示。  
  以前有很多朋友问过我,为什么扫描以后播放列表中的数据条数没有发生相应的改变。要实现播放列表在扫描后更新,必须重新读取多媒体信息到Cursor中,并且重新设置adapter,最后还要调用XXXAdapter.notifyDataSetChanged()来通知UI更新。(可以参考第一张的内容)
  上面的操作都是手动在SDCARD中添加或着删除多媒体文件,下面介绍如何在列表中删除SDCARD中的多媒体文件。
  在上一篇随笔中,我们使用了系统提供的ContentProvider来查询sdcard中的多媒体文件,我们同样可以使用这个ContentProvider来进行删除操作: 
view sourceprint?private void deleteMusic(int position){&
&&& this.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,&&
&&&&&&&&&&& MediaStore.Audio.Media._ID + &=& + _ids[position],&&
&&&&&&&&&&& null);&
   其中“多媒体文件的ID”可以从_ids数组中取得(关于_ids数组请参考第一张的内容)。这样,我们是否就已经从SDCARD中删除了指定_ID的多媒体文件了呢?& 其实当你打开FileExplorer时会发现,原来的文件并没有被删除,— —!杯具,搞了半天文件还在,我第一次遇到这个问题的时候也是纠结了老半天。。。
为什么没有被删除,原因是上面的删除操作只是删除了系统多媒体数据库中的相应记录,而并没有删除SDCAED中的文件(注意:多媒体信息数据库和SDCARD中的多媒体文件并不会自动保持同步),这个时候如果再次扫描SDCARD,你会发现刚才从播放列表中删除的行会再次出现。
   其实要想真正的从SDCARD中删除多媒体文件并不难,可能有朋友会想到这样的方法:遍历SDCARD中的多媒体文件,然后把想要删除的文件和其他文件逐一比较,找到文件路径,最后进行删除。这种方法是可以实现删除操作的,不过效率很低,如果SDCARD中的文件夹以及文件很多,也不知道要用掉多少时间。。
  在上一张中我们从多媒体数据库中读出来一项很重要的信息:MediaStore.Audio.Media.DATA
并且取得里面的字串并存放在了_path数组中,最终的数据格式为:/SDCARD/[子文件夹名]文件名,又了这个路径,我们就可以很方便的从SDCARD中删除多媒体文件了
view sourceprint?private void deleteMusicFile(int position){&
&&& File file = new File(_path[position]);&
&&& file.delete();&
   同样,删除文件后要想播放列表同步更新,也必须执行刚才介绍的一系列操作。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:87375次
积分:1358
积分:1358
排名:第14437名
原创:47篇
转载:15篇
评论:25条
(2)(2)(4)(4)(3)(1)(5)(7)(7)(7)(14)(1)(5)android点滴之标准SD卡状态变化事件广播接收者的注册
目前最完整的,需要注册的动作匹配如下:
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
intentFilter.addDataScheme("file");
mContext.registerReceiver(mMediaReceiver, intentFilter);
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。android adcard新增文件会发送什么广播不.我想SDCARD有改变,就扫描SDCARD_百度知道
android adcard新增文件会发送什么广播不.我想SDCARD有改变,就扫描SDCARD
提问者采纳
在放在后台跑.不然系统很容易卡住,把所有文件的个数保存起来.比如你用浏览器上网,那系统不得忙死.一个一个比较.你想下..就可以知道文件有没有增加了,最好不要频繁的做.,然后以后扫描结束做比较,如果想知道具体是哪个文件有变化.做这个动作很耗系统资源.可以自己起个service,要这新增文件就会广播播拔SD卡有广播消息,那就要记录更多的东西,一堆的缓冲文件可能会生成,然后每隔几分钟去遍历一次SD卡..第一次的时候.这个只能比较个数.新增文件应该不会有广播
腾讯QQ音乐好像有放置MP3文件后,就能立马提取到这个文件,而且很快。
它做了很多过滤吧.比如说它只去查特定的目录,或者是只查特定类型的文件,比较MP3或者WAV.还有这个和你SD卡上文件放的多不多也有关系,要是你SD上东西很少,它就找的很快.
嗯,刚才我实验及次,发现不是腾讯他实现的,我用360手机助手存放文件,好像会自动触发遍历
如果你是通过360手机助手存放文件,那么它存放的路径都是固定的,比如:/mnt/sdcard/music里面.那QQ音乐只要每隔5秒钟,遍历一下这个文件夹就好了啊.这个做起来就很快了.360和腾讯又不是同一家公司....也没有什么文档有说明,360拷完文件,会发消息出来.就算发消息出来,腾讯也不知道是什么消息.它没法做处理.所以说最可能的还是QQ音乐自己去做遍历的.
文件不是固定的,我其实已经实现了
提问者评价
其他类似问题
按默认排序
其他1条回答
FileObserver类能对sdcard中的文件及文件夹的打开、移动和删除操作进行监控Android系统API提供了FileObserver抽象类(Linux的INotify机制)来监听系统&#47、创建;sdcard中的文件或文件夹
您可能关注的推广回答者:
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁3G应用开发之android_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
喜欢此文档的还喜欢
3G应用开发之android
3​G​应​用​开​发​之​a​n​d​r​o​i​d
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:1.48MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢黑马程序员_android实例教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
喜欢此文档的还喜欢
黑马程序员_android实例教程
黑​马​程​序​员​_​a​n​d​r​o​i​d​实​例​教​程​p​p​t
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:1.84MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 can t mount sdcard 的文章

 

随机推荐