2014-02-11 2 views
0

Я новичок в разработке приложений для Android.
Я занимаюсь разработкой музыкального проигрывателя и хотел бы получить название песни, исполнителя, название альбома, обложку альбома из метаданных аудиофайлов.
Я использовал MediaMetadataRetriever, но он медленный, когда есть 800+ песен и возвращает null для некоторых файлов, в то время как другие музыкальные проигрыватели могут получить эту информацию.MediaMetadataRetriever возвращает null, но отлично с MediaStore

Затем я использую MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, чтобы получить название песни, исполнителя, название альбома и MediaStore.Audio.Albums.EXTERNAL_CONTENT_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; 
} 

EDIT: (код использования 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

Спасибо за вас ответить :) Я использовал MediaMetadataRetriever перед использованием Mediastore, но она возвращает нуль для некоторых файлов в то время как другой музыкальный проигрыватель может получить эти данные правильно. Код реализации 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, который является UTF-16

Некоторые (очень много на самом деле) из моих файлов MP3 были старые и когда сделаны по какой-то причине были ISO-8859-1

Использование MP3Tag. Я убедился, что выбран вариант ID3v2.3 UTF-16.

Verify Saving as UTF-16

И тогда выбраны все MP3 файлы, которые я имел, что были ISO-8859-1 и сохранить (или пересохраните) их

Если вы не уверены, если у вас возникли проблемы. Вы можете создать тег столбца в формате MP3, чтобы показать, кодирующем

Create MP3 Tag Column

See Files with wrong Encoding

После resaving все мои мр3, что имел ISO-8859-1 в UTF-16 Теперь MediaMetadataRetriever НИКОГДА не возвращает значения NULL и всегда возвращает правильные данные.

BobVal

Смежные вопросы