2014-02-11 58 views
0

我是一個開發android應用程序的新手。
我正在開發音樂播放器,並希望從音頻文件的元數據中獲取歌曲名稱,藝術家,專輯名稱,專輯封面。
我已經使用MediaMetadataRetriever,但有800多首歌曲時速度很慢,某些文件返回null,而其他音樂播放器可以檢索這些信息。MediaMetadataRetriever返回null,但與MediaStore罰款

然後我用MediaStore.Audio.Media.EXTERNAL_CONTENT_URI來獲取歌曲名稱,藝術家,專輯名稱和MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI以獲得專輯封面。

是否有任何uri同時獲得(歌曲名稱,藝術家,專輯名稱,專輯封面)?
因爲我需要在我的程序中創建歌曲對象。

下面是我的代碼,但它很慢,因爲它要求爲每首歌專輯封面。

public ArrayList<Songs> getPlayList(Context c) { 

    String[] TRACK_PROJ = { 
      MediaStore.Audio.AudioColumns.ARTIST, 
      MediaStore.MediaColumns.TITLE, 
      MediaStore.Audio.AudioColumns.ALBUM, 
      MediaStore.Audio.AudioColumns.YEAR, 
      MediaStore.MediaColumns.DATA 
    }; 
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor cursor = c.getContentResolver().query(uri, TRACK_PROJ, null, null, null); 

    int count; 

    if (cursor != null) { 
     count = cursor.getCount(); 
     if (count > 0) { 
      cursor.moveToFirst(); 
      do { 
       Songs song; 
       String artist = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[0])); 
       String title = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[1])); 
       String album = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[2])); 
       String year = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[3])); 
       String path = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[4])); 
       if (path.toLowerCase().contains(MEDIA_PATH.toLowerCase())) { 
        song = new Songs(artist, title, album, year, path); 
        songsList.add(song); 
       } 
      } while (cursor.moveToNext()); 
     } 
     cursor.close(); 
    } 

    for (Songs aSongsList : songsList) { 

     String[] ALBUM_PROJ = {MediaStore.Audio.Albums.ALBUM_ART}; 
     String selection = MediaStore.Audio.Albums.ALBUM + "=?"; 
     String[] values = new String[]{aSongsList.getAlbum()}; 
     Cursor cur = c.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, ALBUM_PROJ, selection, values, null); 
     int cnt; 
     if (cur != null) { 
      cnt = cur.getCount(); 
      if (cnt > 0) { 
       cur.moveToFirst(); 
       do { 
        String art = cur.getString(cur.getColumnIndex(ALBUM_PROJ[0])); 
        if (art != null) 
         aSongsList.setAlbumArt(art); 
       } while (cur.moveToNext()); 
       cur.close(); 
      } 
     } 
    } 

    return songsList; 
} 

編輯:(使用MediaMetadataRetriever準則)

private Songs getMetadata (File file){ 
    String artist, title, album, path; 
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
    metaRetriever.setDataSource(file.getPath()); 

    try { 

     artist = metaRetriever 
       .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 

     album = metaRetriever 
       .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); 

     path = file.getPath(); 

     title = metaRetriever 
       .extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 

    } catch (Exception e) { 
     artist = "Unknown"; 
     title = "Unknown"; 
     album = "Unknown"; 
     path = "Unknown"; 
    } 

非常感謝!

+0

感謝您的答覆:)我使用MediaStore之前已經使用MediaMetadataRetriever但它返回null某些文件,而其他的音樂播放器可以正確地獲取這些信息。使用MediaMetadataRetriever的實現代碼與您的相同。任何想法?非常感謝! – Janice

回答

0

你知道這一點 - http://developer.android.com/reference/android/media/MediaMetadataRetriever.html

MediaMetadataRetriever metaRetriver; 
metaRetriver = new MediaMetadataRetriever(); 
metaRetriver.setDataSource("/sdcard/audio.mp3"); 

try { 
     byte [] art = metaRetriver.getEmbeddedPicture(); 
     Bitmap songImage = BitmapFactory 
      .decodeByteArray(art, 0, art.length); 
     metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM)); 
        String artist = metaRetriver 
       .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)); 
        String genre = metaRetriver 
       .extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)); 
    } catch (Exception e) { 
     // TO-DO Exception 
    } 

你有興趣在上述API其他可用選項。

0

原來MediaMetadataRetriever只處理一個MP3文件,是我的MP3 UTF-16

一些(還真不少)又舊又當由於某種原因,提出了ISO-8859-1中的所有數據

使用MP3Tag。我確定選擇了ID3v2.3 UTF-16選項。

Verify Saving as UTF-16

然後選擇了所有我有這樣的是ISO-8859-1和保存(或重新保存)他們

如果你,如果你有這個問題是不知道的MP3文件。你可以在MP3創建一個列標籤來顯示編碼

Create MP3 Tag Column

See Files with wrong Encoding

重新保存,畢竟我的MP3是有ISO-8859-1 UTF-16現在MediaMetadataRetriever永遠不會返回空值和總回報正確的數據。

BobVal

相關問題