通過MediaStore來獲取Audio資訊
OPhone系統提供了 MediaScanner,MediaProvider,MediaStore等介面,並且提供了一套資料庫表格,通過Content Provider的方式提供給使用者。當手機開機或者有SD卡插拔等事件發生時,系統將會自動掃描SD卡和手機記憶體上的媒體檔案,如 audio,video,圖片等,將相應的資訊放到定義好的資料庫表格中。在這個程式中,我們不需要關心如何去掃描手機中的檔案,只要瞭解如何查詢和使用 這些資訊就可以了。
MediaStore中定義了一系列的資料表格,通過ContentResolver提供的查詢介面,我們可以得到各種需要的資訊。下面我們重點介紹如何管理SD卡上的音樂檔案資訊。
Cursor cursor = context.getContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Uri:指明要查詢的資料庫名稱加上表的名稱,從MediaStore中我們可以找到相應資訊的引數,具體請參考開發文件。
Projection: 指定查詢資料庫表中的哪幾列,返回的遊標中將包括相應的資訊。Null則返回所有資訊。
selection: 指定查詢條件
selectionArgs:引數selection裡有 ?這個符號是,這裡可以以實際值代替這個問號。如果selection這個沒有?的話,那麼這個String陣列可以為null。
SortOrder:指定查詢結果的排列順序
1.查詢所有歌曲:
Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null ,
null , null , MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if(cursor == null){return;}
if(cursor.moveToFirst(){
do{
//MediaStore.Audio.Media.IS_MUSIC: 是否是音樂檔案,返回0即為音樂媒體檔案
Int isMusic = cursor.getInt (cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));
//MediaStore.Audio.Media._ID:歌曲ID
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._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));
//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));
}while(cursor.moveToNext());
2.查詢歌手資訊:
Cursor cursor = query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, null , null , null ,
MediaStore.Audio.Artists.DEFAULT_SORT_ORDER);
該命令將返回所有在外部儲存卡上的歌手資訊,其中常用的資訊如下:
if(cursor == null){return;}
if(cursor.moveToFirst(){
do{
//MediaStore.Audio.Artists._ID:歌手id
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
//MediaStore.Audio.Artists.ARTIST :歌手姓名
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
//MediaStore.Audio.Artists.NUMBER_OF_ALBUMS: 共有多少該歌手的專輯
Int numOfAlbum = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS));
//MediaStore.Audio.Artists.NUMBER_OF_TRACKS: 共有多少該歌手的歌曲
Int numOfSong = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS));
}while(cursor.moveToNext());
3.查詢專輯資訊:
Cursor cursor = query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null , null , null ,
MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
該命令將返回所有在外部儲存卡上的專輯資訊,其中常用的資訊如下:
if(cursor == null){return;}
if(cursor.moveToFirst(){
do{
//MediaStore.Audio.Albums._ID :專輯id
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
//MediaStore.Audio.Albums.ALBUM:專輯名稱
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
//MediaStore.Audio.Albums.NUMBER_OF_SONGS:共用多少歌曲屬於該專輯
Int numOfSong = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
}while(cursor.moveToNext());
4.查詢播放列表:
Cursor cursor = query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, null , null , null ,
MediaStore.Audio.Playlists.DATE_ADDED + " asc" );
該命令將返回所有在外部儲存卡上的專輯資訊,其中常用的資訊如下:
if(cursor == null){return;}
if(cursor.moveToFirst(){
do{
//MediaStore.Audio.Playlists._ID :播放列表id
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists._ID));
//MediaStore.Audio.Playlists.NAME:播放列表名稱
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.NAME));
//MediaStore.Audio.Playlists.DATE_ADDED :新增時間
long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_ADDED));
//MediaStore.Audio.Playlists.DATE_MODIFIED :修改時間
long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_MODIFIED));
}while(cursor.moveToNext());
通過組合這些查詢結果,指定查詢條件,使用者可以很方便的查詢指定的媒體資訊,比如:查詢屬於指定歌手(歌手id 為 aid)的歌曲:
query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null ,
MediaStore.Audio.Media.ARTIST_ID + "=" + aid, null ,
MediaStore.Audio.Media.TITLE);
查詢屬於指定專輯(專輯id 為 aid)的歌曲:
return query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null ,
MediaStore.Audio.Media.ALBUM_ID + "=" + aid, null ,
MediaStore.Audio.Media.TITLE);
通過AlbumId查詢出專輯封面Uri地址:
Cursor cursor = context.getContentResolver().query(Uri.parse("content://media/external/audio/albums/" + albumId), new String[]{"album_art"}, null, null, null);
if(cursor == null){return;}
if(cursor.moveToFirst(){
do{
uri = cursor.getString(0);
}while(cursor.moveToNext());