我正在创建一个音乐播放器,我正在使用Cursor检索设备上的音乐
mCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
requestedColumns, null, null, null);
其中
private String[] requestedColumns =
{
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.YEAR,
MediaStore.Audio.Media.DURATION,
};
现在这完美无缺,我正在设备/ SD卡上成功检索音乐。我的问题是:有没有办法让特定歌曲的专辑艺术家?现在我并不仅仅意味着这首歌的艺术家,而是一首歌所属的整张专辑背后的主要艺术家。似乎没有某种MediaStore.Audio.Media.ALBUM_ARTIST
。
旁注:使用MediaStore.Audio.Media.ALBUM
和MediaStore.Audio.ALBUMS
之间有什么区别(如果有的话)?
答案 0 :(得分:2)
我认为您所寻找的是MediaStore.Audio.Albums.ARTIST
,您可以将其视为两阶段流程的第二部分。
Cursor cursor = getActivity().managedQuery(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ARTIST},
MediaStore.Audio.Albums._ID+ "=?",
new String[] {albumId},
null);
其中albumId
是歌曲的专辑ID,即您在之前的查询中得到的内容:MediaStore.Audio.Media.ALBUM_ID
将MediaStore.Audio.ALBUMS
视为有关所有相册的元数据。 MediaStore.Audio.Media.ALBUM
指的是此音频文件所来自的专辑。 Media
始终是关于每个文件的元数据。
答案 1 :(得分:0)
在我的应用程序中,我注意到了同样的问题,因此使用人工元数据进行了测试:
我测试了Android 4.4.4(Cyanogen),Android 6.0.1(谷歌)和Android 7.1.2(AOSP,非官方)。我无法访问Android 8.0或8.1。
结果:Android将“Artist-A”显示为专辑艺术家。这显然是不正确的。
Android中有两个错误:
various
,但它会选择any
。此外,上面提到的错误#52309很久以前已经关闭,评论“已过时”。即使是参考音乐播放器Google Play Music,也会遇到同样的错误,这是无稽之谈。
那么我们有什么解决方案?
various
,以防它们不匹配。答案 2 :(得分:0)
这有效。不要问我如何!
public Cursor getAlbumArtistCursor(Context context) {
ContentResolver cr = context.getContentResolver();
// query all media and get the album_artist field
return cr.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{ "album_artist", MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media._ID}, null, null, null);
}