Android - 从Cursor获取专辑艺术家

时间:2013-06-30 15:39:37

标签: android

我正在创建一个音乐播放器,我正在使用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.ALBUMMediaStore.Audio.ALBUMS之间有什么区别(如果有的话)?

3 个答案:

答案 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)

在我的应用程序中,我注意到了同样的问题,因此使用人工元数据进行了测试:

  • 专辑“Testalbum”有两首曲目
  • 第一首曲目:艺术家“艺术家A”,专辑 - 艺术家“测试专辑 - 艺术家”。
  • 第二首曲目:艺术家“艺术家-B”,专辑 - 艺术家“测试专辑 - 艺术家”。

我测试了Android 4.4.4(Cyanogen),Android 6.0.1(谷歌)和Android 7.1.2(AOSP,非官方)。我无法访问Android 8.0或8.1。

结果:Android将“Artist-A”显示为专辑艺术家。这显然是不正确的。

Android中有两个错误:

  • Android会忽略相册艺术家代码。
  • Android不会比较所有艺术家:如果艺术家不同,Android应该选择various,但它会选择any

此外,上面提到的错误#52309很久以前已经关闭,评论“已过时”。即使是参考音乐播放器Google Play Music,也会遇到同样的错误,这是无稽之谈。

那么我们有什么解决方案?

  1. 尝试重新打开旧的错误报告。
  2. 撰写新的错误报告。
  3. 修复LineageOS源代码中的行为或类似行为。
  4. “活着”的错误。
  5. 阅读所有曲目并使用various,以防它们不匹配。
  6. 独立于Android获取元数据,例如使用标记库。

答案 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);
}