android媒体库的更新
当进行媒体文件的操作时,以音乐播放器为例,会涉及到音频文件的新增和删除,此时虽然当文件已经做过更改,但存放媒体数据的系统数据库并没有更新,因此当我们以系统数据库的方式获得资源时会得不到新文件的目录。那么,多媒体的数据库的更新是在什么时候?
具体是在当android系统启动的时候,即开机的时候,显然我们通过开关机来实现媒体库更新是不现实。android系统在启动的时候会发送一个系统广播,来更新数据库,但是android4.4以后已经不允许非系统应用发送系统广播,所以我们无法通过发送广播的方法更新媒体库。
接下来具体介绍新增的方法,以及删除方法。
新增资源媒体数据库的更新
public class MediaScanner {
public MediaScanner(Context context,File file)
{
MediaScannerConnection.scanFile(context ,
new String[]{file.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
}
此方法的特点:
1. 要求传入的file是具体的文件路径,所以是针对单个文件的更新
2. 无法对文件夹进行更新
3. 因为只针对单个文件,所以效率很高
4. 每当有新的文件加载的时候,就执行该方法更新数据库能够很好的实现列表更新
删除资源后媒体库的更新
通过ContentResolver调用delete()方法,从对应的数据库数据库中删除媒体数据(两种方式)
delete (Uri url, //路径
String where, //条件
String[] selectionArgs)//条件内容
方法一:
public void DeleteMusicDatabase(long ID){ //这里的ID是数据库中获取的文件_Id
ContentResolver contentResolver = this.getContentResolver();
Uri deleteIdUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ID);
//将id和路径绑定在一起,此Id相当于数据库中的主键
int res = contentResolver.delete(deleteIdUri, null, null);
//传入绑定后的路径后,后续两个参数null的意思是删除对应路径下的所有数据库记录,因为我们绑定了
//唯一的Id,所以能够成功删除文件,但是如果绑定失败,可能会出现类似增一个表被删除的情况。
//delete的返回值是该操作所影响的行数,所以当res = 1,就是删除了一条记录,0 表示删除失败
Toast.makeText(this,ID+""+res,Toast.LENGTH_SHORT).show();
}
特点:delete()通过绑定过Id的路径直接找到记录,较为高效,但是不够灵活,又是操作不当还会导致误删。
方法二:
public void DeleteMusicDatabase(long ID){ //这里的ID是数据库中获取的文件_Id
ContentResolver contentResolver = this.getContentResolver();
int res = contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.Audio.Media._ID + "=" +ID, null);
//MediaStore.Audio.Media.EXTERNAL_CONTENT_URI数据库表所在路径
//这里用到了后面的参数,第二个表示delete判断的条件,MediaStore.Audio.Media._ID表示
//我要判断的列后面加上我想要删除对应的文件Id
Toast.makeText(this,ID+" "+res,Toast.LENGTH_SHORT).show();
Toast.makeText(this,ID+""+res,Toast.LENGTH_SHORT).show();
}
特点:比较灵活,当然不局限与Id任何文件相关的参数都可以用来判断如title。。。,同时效率较之前肯定稍弱。同时左后一个参数我并没有用,因为我在前一个里把条件写全了,当然也可以换一种方式用上最后一个参数,如下 delete(url, column + "=?",new String []{"条件"});
小结
本来以为很简单的一个功能,自己断断续续磨了一个晚上,虽然效率感人,但是还是有些些许的收获。