Android:查询MediaStore.Audio.Artists.Albums

时间:2011-08-17 15:18:04

标签: android media android-contentprovider

目前,我通过正常的ContentResolver成功查询MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,并获得预期的结果。文档说有一个嵌套类MediaStore.Audio.Artists.Albums,它是一个子目录,包含每个艺术家的每个专辑,但它没有等效的EXTERNAL_CONTENT_URI。我怎么查询呢?

或者更一般地说,鉴于艺术家,如何列出该艺术家包含歌曲的每张专辑?目前我正在通过MediaStore.Audio.Media搜索艺术家并在HashMap中记录每个专辑进行详尽搜索,但这看起来既错误又低效。有没有更直接使用ContentProviders的更有效方法?

2 个答案:

答案 0 :(得分:2)

这不是你想做我想你想做的事情。如果是,你可以通过点击媒体表(Media.EXTERNAL_CONTENT_URI)获得艺术家的所有专辑 - 而不是专辑艺术家的专辑。 )在where子句中使用Media.ARTIST_ID进行不同的Media.ALBUM。这适用于任何Android版本。

然而......如果您想与专辑艺术家合作......

在2.3.3之前,Album Artist MP3标签被忽略,不在Media Store架构中。它现在在那里 - 例如CyanogenMod拥有它 - 但它还没有记录。如果您计划发布代码,则需要对其进行测试并在缺少代码时进行解决,或者将代码限制为具有该代码的Android版本。否则,你会被艺术家数据库所困扰,该数据库代表每首歌曲上的每位艺术家,如果您正在考虑专辑,这可能不是您所追求的。

以下是我的代码中的测试:

Cursor cur = getContentResolver().query(Albums.EXTERNAL_CONTENT_URI, null, null, null, null);
if ((cur.getColumnIndex("album_artist") == -1) || (cur.getColumnIndex("album_artist_id") == -1))
{
    showartist = false;
}
else
{
    showartist = true;
}

您可以选择不同的ID以获取具有以下内容的相册艺术家列表:

cur = getContentResolver().query(Albums.EXTERNAL_CONTENT_URI, new String[]{"distinct album_artist_id", "album_artist"}, null, null, "album_artist collate nocase");

请注意,因为没有记录列并且常量不可用,所以您必须编写自己的常量或对字符串进行硬编码。你可以从那里找出其余部分。

答案 1 :(得分:0)

Uri: MediaStore.Audio.Artists.Albums.getContentUri(“external”,); 为我工作。