Android: запрос MediaStore.Audio.Artists.Albums

В настоящее время я успешно запрашиваю MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI через обычный ContentResolver и получаю ожидаемые результаты. В документах говорится, что существует вложенный класс MediaStore.Audio.Artists.Albums, который представляет собой подкаталог, содержащий все альбомы для каждого исполнителя, однако у него нет эквивалентного EXTERNAL_CONTENT_URI. Как я могу запросить его?

Или, в более общем смысле, с учетом исполнителя, как я могу перечислить все альбомы, содержащие песню этого исполнителя? В настоящее время я делаю это путем исчерпывающего поиска через MediaStore.Audio.Media в поисках исполнителя и записи каждого альбома в HashMap, но это кажется неправильным и неэффективным. Есть ли более эффективный способ, напрямую использующий ContentProviders?


person Fraser    schedule 17.08.2011    source источник


Ответы (2)


Это не совсем то, как вы хотите делать то, что, как мне кажется, вы хотите сделать. Media.ALBUM с Media.ARTIST_ID в вашем предложении where. Это будет работать в любой версии Android.

Однако... если вы хотите работать с исполнителями альбомов...

До версии 2.3.3 тег MP3 исполнителя альбома игнорировался и отсутствовал в схеме магазина мультимедиа. Он уже есть — например, у 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;
}

Вы можете сделать выбор для разных идентификаторов, чтобы получить список исполнителей альбома примерно так:

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

Обратите внимание: поскольку столбцы не задокументированы, а константы недоступны, вам придется создавать свои собственные константы или жестко закодировать строки. Вы, вероятно, можете понять остальное оттуда.

person Earl    schedule 17.08.2011
comment
Спасибо, вы были правы в первый раз, я хочу, чтобы все АЛЬБОМы содержали хотя бы одну песню от ARTIST, а не тег исполнителя альбома, который, как я знаю, является отдельным. Кроме того, в идеале я хотел бы вернуть курсор, который я могу передать в ListView, поэтому он должен содержать _ID, что исключает использование различных. Меня также беспокоит использование DISTINCT, так как предполагается, что поставщик контента поддерживается базой данных SQL, что может измениться в будущем (это немного хакерски). Я хотел бы знать, как запрашивается MediaStore.Audio.Artists.Albums, я предполагаю, что это возможно, иначе зачем это было бы в документах? - person Fraser; 17.08.2011
comment
Существует Media.ALBUM_ID, который можно применить к первой половине моего ответа. Я бы не стал беспокоиться об использовании «различного». SQLite не исчезнет в ближайшее время. - person Earl; 17.08.2011

Uri: MediaStore.Audio.Artists.Albums.getContentUri("внешний", ); работал на меня.

person Steelight    schedule 01.08.2012