我是开发Android应用程序的新手
我正在开发一个音乐播放器,想从音频文件的元数据中获取歌曲名称,艺术家,专辑名称,专辑封面。
我使用过MediaMetadataRetriever
但是当有800多首歌曲时它很慢并且对于某些文件返回null而其他音乐播放器可以检索这些信息。
然后我使用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;
}
编辑:(使用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 :(得分: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中的其他可用选项感兴趣。
答案 1 :(得分:0)
事实证明MediaMetadataRetriever只处理UTF-16的MP3文件中的所有数据
我的MP3中的一些(很多)很老了,出于某种原因制作的是ISO-8859-1
使用MP3Tag。我确保选择了ID3v2.3 UTF-16选项。
然后选择我拥有的所有ISO-8859-1 MP3文件并保存(或重新保存)
如果您不确定是否遇到此问题。您可以在MP3中创建Column标签以显示编码
将所有具有ISO-8859-1的MP3重新保存为UTF-16后现在MediaMetadataRetriever NEVER返回Null并始终返回正确的数据。
BobVal