我正在尝试构建一个MP3播放器,我希望ImageView能够显示各个歌曲的专辑封面。我尝试了以下方法,但它不起作用。
albumcover = (ImageView) findViewById(R.id.cover);
String coverPath = songsList.get(songIndex).get(MediaStore.Audio.Albums.ALBUM_ART);
Drawable img = Drawable.createFromPath(coverPath);
albumcover.setImageDrawable(img);
当我尝试播放歌曲时,我得到的只是ImageView中的空白屏幕。
答案 0 :(得分:17)
以下是我如何获得一首歌的专辑封面:
Cursor cursor = getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID+ "=?",
new String[] {String.valueOf(albumId)},
null);
if (cursor.moveToFirst()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
// do whatever you need to do
}
albumId
指的是该歌曲的MediaStore.Audio.Media.ALBUM_ID
。
如果你正在寻找特定歌曲的专辑封面(而不是在专辑列表中),据我所知,这是一个两阶段的过程,因为ALBUM_ART
是{{1}的属性并且不能直接作为歌曲元数据使用。
答案 1 :(得分:7)
如果你有专辑ID,你可以获得专辑图片uri: -
final public static Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri,
listOfAlbums.get(position).getAlbumID());
如果你有一个Image uri,你可以使用任何图像加载器Glide,Picaso,UIL来显示图像。
**OR**
你可以编写自己的图像加载器
public Bitmap getAlbumart(Context context, Long album_id) {
Bitmap albumArtBitMap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
try {
final Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
albumArtBitMap = BitmapFactory.decodeFileDescriptor(fd, null,
options);
pfd = null;
fd = null;
}
} catch (Error ee) {
} catch (Exception e) {
}
if (null != albumArtBitMap) {
return albumArtBitMap;
}
return getDefaultAlbumArtEfficiently(context.getResources());
}
public Bitmap getDefaultAlbumArtEfficiently(Resources resource) {
if (defaultBitmapArt == null) {
defaultBitmapArt = decodeSampledBitmapFromResource(resource,
R.drawable.default_album_art, UtilFunctions
.getUtilFunctions().dpToPixels(85, resource),
UtilFunctions.getUtilFunctions().dpToPixels(85, resource));
}
return defaultBitmapArt;
}
答案 2 :(得分:6)
ContentResolver musicResolve = getContentResolver();
Uri smusicUri = android.provider.MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
Cursor music =musicResolve.query(smusicUri,null //should use where clause(_ID==albumid)
,null, null, null);
music.moveToFirst(); //i put only one song in my external storage to keep things simple
int x=music.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART);
String thisArt = music.getString(x);
Bitmap bm= BitmapFactory.decodeFile(thisArt);
ImageView image=(ImageView)findViewById(R.id.image);
image.setImageBitmap(bm);
答案 3 :(得分:2)
此方法返回带有歌曲路径和专辑封面的ArrayList。
public static ArrayList<CommonModel> getAllMusicPathList(Context context) {
ArrayList<CommonModel> musicPathArrList = new ArrayList<>();
Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursorAudio = context.getContentResolver().query(songUri, null, null, null, null);
if (cursorAudio != null && cursorAudio.moveToFirst()) {
Cursor cursorAlbum;
if (cursorAudio != null && cursorAudio.moveToFirst()) {
do {
Long albumId = Long.valueOf(cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
cursorAlbum = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=" + albumId, null, null);
if(cursorAlbum != null && cursorAlbum.moveToFirst()){
String albumCoverPath = cursorAlbum.getString(cursorAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
String data = cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.DATA));
musicPathArrList.add(new CommonModel(data,albumCoverPath ,false));
}
} while (cursorAudio.moveToNext());
}
}
return musicPathArrList;
}
这是CommonModel。
public class CommonModel {
private String path;
private boolean selected;
public String getAlbumCoverPath() {
return albumCoverPath;
}
public void setAlbumCoverPath(String albumCoverPath) {
this.albumCoverPath = albumCoverPath;
}
private String albumCoverPath;
public CommonModel(String path, String albumCoverPath, boolean b) {
this.path = path;
this.albumCoverPath=albumCoverPath;
this.selected=b;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean getSelected() {
return selected;
}
public void setSelected(boolean selected) {
selected = selected;
}
}
答案 4 :(得分:0)
你应该使用Uri.parse(“content:// media / external / audio / albumart”);查询albumart。第一个答案可能会在某些手机上出现异常(至少是我的)
答案 5 :(得分:0)
以下代码对我有用。我知道它已经被回答了,对于检查参考的人来说可能是有用的。
public void getAlbumArt() {
try {
ContentResolver cr = getContentResolver();
Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
Cursor cursor = cr.query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int albumart = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
do {
String Albumids = cursor.getString(albumart);
Albumid.add(Albumids);
} while (cursor.moveToNext());
}cursor.close();
} catch (NumberFormatException e){
e.printStackTrace();
}
}
public void getSelectedPath(){
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String path= String.valueOf(listView.getItemAtPosition(i));
if(path.equals("null")){
ImageView imgv=(ImageView)view.findViewById(R.id.imageView);
imgv.setImageResource(R.drawable.unknowalbum);
imgv.setMaxHeight(50);
imgv.setMaxWidth(50);
}
else{
Drawable image=Drawable.createFromPath(path);
ImageView imgview=(ImageView)view.findViewById(R.id.imageView);
imgview.setImageDrawable(image);
}
}
});
}
完整代码访问http://vasistaguru.blogspot.com/2017/02/get-albumart-and-trackname-using.html
答案 6 :(得分:0)
示例代码
public static Uri getAlbumArtUri(long albumId) {
return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId);
}
ArrayList<Uri> albumArtUris = new ArrayList<>();
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{"album_id"}, null, null, null);
cursor.moveToFirst();
do {
long ablumId = cursor.getLong(cursor.getColumnIndexOrThrow("album_id"));
albumArtUris.add(getAlbumArtUri(ablumId));
} while (cursor.moveToNext());