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 []{"条件"});

小结

本来以为很简单的一个功能,自己断断续续磨了一个晚上,虽然效率感人,但是还是有些些许的收获。