在上一篇随笔中,我介绍了如何在程序中查询sdcard内的多媒体文件,并且显示到播放列表中,但是,如果在sdcard内删除、增加一些多媒体文件,如何让播放列表也更新呢,这里我分享一下自己在项目中的一些解决方法,希望对大家有所帮助。
首先,我简单介绍一下android是如何扫描sdcard内的多媒体信息的,详细请阅读stay的博文:http://www.cnblogs.com/stay/articles/1957571.html
当android的系统启动的时候,系统会自动扫描sdcard内的多媒体文件,并把获得的信息保存在一个系统数据库中,以后在其他程序中如果想要访问多媒体文件的信息,其实就是在这个数据库中进行的,而不是直接去sdcard中取,理解了这一点以后,问题也随着而来:如果我在开机状态下在sdcard内增加、删除一些多媒体文件,系统会不会自动扫描一次呢?答案是否定的,也就是说,当你改变sdcard内的多媒体文件时,保存多媒体信息的系统数据库文件是不会动态更新的。
那么如何让多媒体数据库中的数据更新呢?我们可以采用广播机制来实现:在应用程序中发送一个广播,让android系统扫描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()))); }
其中ScanSdReceiver是一个自定义的广播接收器,继承自BroadCastReceiver,因为android系统开始扫描sdcard以及扫描完毕时都会发送一个系统广播来表示当前扫描的状态,这样我们就可以很方便通过判断当前的扫描状态加一些自己的逻辑操作,ScanSdReceiver的代码如下:
public class ScanSdReceiver extends BroadcastReceiver {
private AlertDialog.Builder builder = null;
private AlertDialog ad = null;
private int count1;
private int count2;
private int count;
@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来进行删除操作:
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中删除多媒体文件了
private void deleteMusicFile(int position){
File file = new File(_path[position]);
file.delete();
}
- 大小: 18 KB
- 大小: 17.4 KB
分享到:
相关推荐
Android SDCard 操作(文件读写、容量计算) Android SDCard 操作是指在 Android 系统中对 SD 卡的读写和容量计算操作。SD 卡是 Android 设备中的一种外部存储设备,用于存储数据、音乐、图片、视频等文件。 ...
在Android平台上,开发人员经常需要处理文件操作,特别是在涉及到用户数据存储或媒体展示时。本教程将详细讲解如何从SD卡(外部存储)中读取文件信息,并将其中的图片加载到`ImageView`组件中进行显示。这涉及到...
在Android平台上,对SDCard(外部存储)进行文件操作是应用程序与用户交互的重要部分,尤其对于需要存储大量数据或媒体文件的应用来说。本教程将详细解释如何在Android中读写SDCard文件,非常适合初学者入门。 首先...
在Android系统中,将中文文件镜像上传到SD卡是一个常见的需求,特别是在处理系统更新、应用安装或数据备份时。本文将深入探讨如何在Android设备上实现这一操作,重点介绍与"android"、"镜像"、"中文"以及"UltraISO...
代码如下:// 读取sdcard文件private void sdcardRead(){String fileName = “/sdcard/my_sdcard.txt”;// assets下文件//String fileName = “/sdcard/test/my_sdcard_test.txt”;// sdcard下子目录文件String ret =...
在Android平台上,对SDCard(外部存储)进行文件读写是常见的操作,尤其对于需要存储大量数据或用户数据的应用来说。这个"Android应用源码SdCard读写文件实例.zip"压缩包提供了一个示例,帮助开发者理解如何在...
本文将详细介绍如何在Android应用中对SDCard进行读写操作,包括获取缓存目录、文件目录的方法以及具体的读写实现。 #### 二、获取缓存目录与文件目录 1. **获取缓存目录**: - `getCacheDir()`:此方法用于获取...
在Android平台上,开发一款应用来实现从SDCard中读取TXT文件并展示为翻书效果,需要涉及到多个技术层面。以下将详细介绍这个过程中的关键知识点: 1. **Android权限管理**: 在Android中,访问外部存储(如SDCard...
android应用开发中关于SDCard读写操作的实例代码,在下载学习SDCard操作中,碰到很棘手的问题了。不过最后还在我的坚持下成功了,
本文将详细介绍如何在Android应用中进行SDCard的操作,包括文件的读写以及容量的计算等内容。通过掌握这些知识点,开发者能够更好地利用外部存储空间来提高应用程序的功能性和用户体验。 #### Android SDCard操作...
在Android系统中,外置SDCard(也称为外部存储)是设备上用于扩展存储空间的区域,用户可以在这个空间上存储各种数据,如媒体文件、应用程序数据等。本篇文章将详细探讨如何在Android应用中实现对外置SDCard的读取、...
在Android平台上,对SDCard(外部存储)进行文件读写是常见的操作,尤其对于需要存储用户数据或资源的应用来说更是必不可少。本实例将探讨如何在Android应用中实现SdCard的读写功能。 首先,我们需要了解Android对...
在安卓(Android)平台上,对SdCard(外部存储设备)进行读写文件是应用程序开发中的常见操作。这里,我们将详细探讨如何通过源码实现这一功能,并了解相关的知识点。 首先,安卓系统为开发者提供了`java.io`和`...
本篇将详细介绍在Android 2.3及更高版本中,如何获取和操作Android设备的内存目录以及SDCard目录。 首先,我们要理解Android的存储架构。内部存储主要用于存储应用私有的数据,这些数据对其他应用是不可见的。而...
一个关于文件操作的静态工具类 实现手机SD卡目录或文件的拷贝 移动 删除 递归 Demo中有详细注释 在进行Demo测试时 建议先把测试的文件备份一下在测试 否则删除就找不回了 具体可见我博客...实现手机SD卡目录或文件的...
android调试sdcard文件加载,解决不能传入文件问题: 只需要执行4个命令,win和mac下都好使。
// suffix:需要选择的文件后缀,比如需要选择wav、mp3文件的时候设置为".wav;.mp3;",注意最后需要一个分号(;) // images:用来根据后缀显示的图标资源ID。 // 根目录图标的索引为sRoot; // 父目录的索引为...