1. 程式人生 > >通過MediaStore來獲取Audio資訊

通過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());