2011-08-17 48 views
1

目前,我通過正常的ContentResolver成功查詢MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,並獲得預期的結果。該文檔說有一個嵌套類MediaStore.Audio.Artists.Albums是包含每個藝術家的每個專輯的子目錄,但它沒有等效的EXTERNAL_CONTENT_URI。我如何查詢它?Android:查詢MediaStore.Audio.Artists.Albums

或者更一般地說,對於一個藝術家,如何列出每個包含該藝術家的歌曲的專輯?目前,我正在通過MediaStore.Audio.Media搜索藝術家並在HashMap中記錄每個專輯的方式進行詳盡搜索,但這看起來既錯誤又效率低下。有沒有更有效的方式直接使用ContentProvider?

回答

2

這並不是你想要做的事情,我想你想做的事情。如果是這樣,你可以通過點擊媒體表格(媒體)來獲得藝術家的所有專輯 - 而不是專輯藝術家。 EXTERNAL_CONTENT_URI)爲不同的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; 
} 

你可以做一個選擇了不同的ID來獲得專輯藝術家列表像這樣的東西:

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

需要注意的是,因爲列沒有記錄並且常量不可用,所以您必須編寫自己的常量或對字符串進行硬編碼。你大概可以從那裏弄清楚其餘的。

+0

謝謝,你第一次是對的,我希望所有包含ARTIST至少一首歌的所有專輯,而不是專輯封面,我知道它是獨立的。另外,理想情況下,我想返回一個可以傳遞給ListView的遊標,因此它需要包含一個_ID,這就排除了使用distinct。 我還擔心使用DISTINCT,因爲它假設內容提供者是由SQL數據庫支持的,而這可能不是將來的情況(這有點「hacky」)。我想知道MediaStore.Audio.Artists.Albums如何被查詢,我認爲這是可能的,否則爲什麼它會在文檔中? – Fraser

+0

有一個Media.ALBUM_ID可用於我的答案的前半部分。我不會擔心使用'獨特'。 SQLite不會很快消失。 – Earl

+0

優秀點,這是有道理的。謝謝! – Fraser

0

The Uri: MediaStore.Audio.Artists.Albums.getContentUri(「external」,); 爲我工作。