Это был исходный ответ
я отсортировал уникальные альбомы, проверив, не были ли они уже добавлены на мою карту
public Map<String, String> getAlbumList(Context c) {
//setup map and cursor
Map<String, String> result = new HashMap<String, String>();
String selection = MediaStore.Audio.Media.IS_MUSIC + " !=0";
final Cursor mCursor = c.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM_ID,}, selection, null,
"LOWER ("+MediaStore.Audio.Media.ALBUM + ") ASC");
int count = mCursor.getCount();
String[] mArtist = new String[count];
String[] mAlbum = new String[count];
String[] AlbumID = new String[count];
int i = 0;
int j = 0;
if (mCursor.moveToFirst()) {
do {
mAlbum[i] = mCursor
.getString(mCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
mArtist[i] = mCursor.getString(mCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
AlbumID[i] = Long.toString(mCursor
.getLong(mCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)));
//checking for same previous value
if(result.containsValue(mAlbum[i])){
}else{
result.put("artist" + j, mArtist[i]);
result.put("album" + j, mAlbum[i]);
result.put("AlbumID" + j, AlbumID[i]);
j = j + 1;
}
i = i + 1;
} while (mCursor.moveToNext());
}
result.put("count", Integer.toString(j));
mCursor.close();
return result;
}
}
возможно, не самое красивое решение для уникальной сортировки альбомов... но оно работает именно так, как задумано, без возни с sqlite....
я передаю контекст здесь, потому что я использую список во фрагменте с настраиваемым адаптером без контекста активности, getContentResolver() не работает....
дополнение к исходному ответу
mArt, mData, mAlbums и mArtists — это списки массивов...
private void getList(View view){
mArt.clear();
mAlbums.clear();
mArtists.clear();
String[] projection = {"DISTINCT " + MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST
} ;
String[] projection2 = {"Distinct " + MediaStore.Audio.Albums.ALBUM,
MediaStore.Audio.Albums.NUMBER_OF_SONGS};
Cursor mCursor = getActivity().getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, "0==0 ) GROUP BY (" + MediaStore.Audio.Media.ALBUM_ID, null, MediaStore.Audio.Media.ALBUM + " COLLATE NOCASE ASC");
Cursor mCursor2 = getActivity().getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, projection2, null, null, MediaStore.Audio.Albums.ALBUM + " COLLATE NOCASE ASC");
if(mCursor != null && mCursor.getCount() > 0 && mCursor2 != null && mCursor2.getCount() > 0){
CursorJoiner joiner = new CursorJoiner(mCursor, new String[]{MediaStore.Audio.Media.ALBUM},mCursor2, new String[]{MediaStore.Audio.Albums.ALBUM});
for (CursorJoiner.Result joinerResult : joiner) {
switch (joinerResult) {
case LEFT:
break;
case RIGHT:
break;
case BOTH:
String songs_s = "Song";
int tracks = mCursor2.getInt(mCursor2.getColumnIndex(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
if (tracks > 1) {
songs_s = "Songs";
}
mArtists.add(tracks + " " + songs_s + " By " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
mAlbums.add(mCursor2.getString(mCursor2.getColumnIndex(MediaStore.Audio.Albums.ALBUM)));
mArt.add(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))));
}
}
}
mCursor.close();
mCursor2.close();
}
Предложение GROUP BY в выборе гарантирует уникальные альбомы, поскольку обложка альбома определяется идентификатором альбома в этой строке:
mArt.add(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))));
следит за тем, чтобы обложка альбома и сам альбом находились в одном положении...
здесь я использую средство объединения курсоров, чтобы получить исполнителя, альбом и количество песен в альбоме... это можно вернуть только из двух отдельных запросов...
person
me_
schedule
25.10.2013