Я новичок в разработке приложений для 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";
}
Спасибо большое !!!
Спасибо за вас ответить :) Я использовал MediaMetadataRetriever перед использованием Mediastore, но она возвращает нуль для некоторых файлов в то время как другой музыкальный проигрыватель может получить эти данные правильно. Код реализации MediaMetadataRetriever такой же, как ваш. Есть идеи? Большое спасибо! – Janice