MediaStore这个类是 android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频 ,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了
MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息。下面我们重点介绍查询SD卡上的音乐文件信息。
先来了解一下ContentResolver的查询接口:
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档。
Projection: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有 ?这个符号是,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null。
SortOrder:指定查询结果的排列顺序
下面的命令将返回所有在外部存储卡上的音乐文件的信息:
[code]Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); [/code]
得到cursor后,我们可以调用Cursor的相关方法具体的音乐信息:
歌曲ID:MediaStore.Audio.Media._ID
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
先来了解一下ContentResolver的查询接口:
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档。
Projection: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有 ?这个符号是,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null。
SortOrder:指定查询结果的排列顺序
下面的命令将返回所有在外部存储卡上的音乐文件的信息:
[code]Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); [/code]
得到cursor后,我们可以调用Cursor的相关方法具体的音乐信息:
歌曲ID:MediaStore.Audio.Media._ID
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
播放音频就是通过这个ID来索引
歌曲的名称 :MediaStore.Audio.Media.TITLE
String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
歌曲的专辑名:MediaStore.Audio.Media.ALBUM
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
歌曲的歌手名: MediaStore.Audio.Media.ARTIST
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
歌曲文件的路径 :MediaStore.Audio.Media.DATA
String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
路径转为URI用 Uri.fromFile(new File(url));
歌曲的总播放时长 :MediaStore.Audio.Media.DURATION
Int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
歌曲文件的大小 :MediaStore.Audio.Media.SIZE
Int size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
还有一些其他的 看代码吧.
// 获取歌曲详细信息
String[] colums = {
MediaStore.Audio.Media.DATA,// 歌曲文件的路径
MediaStore.Audio.Media._ID,// 歌曲ID
MediaStore.Audio.Media.TITLE,// 歌曲标题
MediaStore.Audio.Media.DISPLAY_NAME,// 歌曲名称
MediaStore.Audio.Media.MIME_TYPE,// 歌曲的播放格式
MediaStore.Audio.Media.ARTIST,// 歌曲的歌手名
MediaStore.Audio.Media.ALBUM,// 歌曲的唱片集
MediaStore.Audio.Media.IS_RINGTONE,//
MediaStore.Audio.Media.IS_ALARM,// 歌曲的专辑名
MediaStore.Audio.Media.IS_MUSIC,//
MediaStore.Audio.Media.IS_NOTIFICATION,//
MediaStore.Audio.Media.DURATION // 歌曲的总播放时长
};
// 调用 managedQuery()来查询MediaStore
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
colums, null, null, null);
// 获得索引
int fileColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
int titleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int displayColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME);
int mimeTypeColumn = cursor.getColumnIndex(MediaStore.Audio.Media.MIME_TYPE);
// moveToFirst() 获得返回的第一个结果
if (cursor.moveToFirst()) {
String audioFilePath = cursor.getString(fileColumn);// 路径
String mimeType = cursor.getString(mimeTypeColumn);// mime类型
// 获取mime之后就可以用意图启动内置的音频播放器 或者用MediaPlayer播放
// 构造一个file对象并调用Uri.fromFile来获取Uri
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
File newFile = new File(audioFilePath);
intent.setDataAndType(Uri.fromFile(newFile), mimeType);
startActivity(intent);
}