我对如何实现这个问题感到遗憾,因为Content Provider URI查询不支持简单的SQL“DISTINCT”查询方法将游标返回到mediastore中歌曲的Artists,删除任何重复的条目。
我可以向所有艺术家查询并获取光标,我只是如何删除欺骗,或者根本不显示它们。
我已经尝试使用matrixcursor来构造一个删除了dupe条目的新游标,但它很慢(构建一个艺术家数组,如果在该数组中不复制到新的matrixcursor等)。
任何人都可以推荐更好的解决方案,或者指出正确的方向吗?
我还考虑过将所需信息预先加载到一个对象数组中 - 我只关心应用程序中的内存开销。
感谢您提供的任何帮助。
答案 0 :(得分:1)
获取所有艺术家列表(和相册的方法相同)的最简单方法是使用MediaStore.Audio.Artist进行任务。例如,像这样的东西会显示所有艺术家:
String[] proj = {MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_ALBUMS, MediaStore.Audio.Artists.NUMBER_OF_TRACKS };
musiccursor = managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, proj, null, null, MediaStore.Audio.Artists.ARTIST + " ASC");
String[] from= new String[]{ MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_ALBUMS, MediaStore.Audio.Artists.NUMBER_OF_TRACKS };
int[] to = new int[] { R.id.songname, R.id.rowlength, R.id.rowartist };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.musicrow, musiccursor, from, to);
SongsView.setAdapter(adapter);
其中SongsView将是您显示它们的列表。其他所有内容都使用简单的Cursor适配器
希望这有帮助
答案 1 :(得分:0)
您可能想尝试创建有状态的CursorWrapper,覆盖适当的方法。只需确保对next()的每次调用都会遍历游标,直到找到您认为适当唯一的艺术家名称,可选地将看到的艺术家存储在ArrayList实例变量中。
答案 2 :(得分:0)
ArrayList<SongBeen> genresList=new ArrayList<SongBeen>();
String value=search+ "%";
String[] inValue=new String[] {value};
ContentResolver musicResolver = activity.getContentResolver();
/*Uri musicInUri = android.provider.MediaStore.Audio.Genres.INTERNAL_CONTENT_URI;
Cursor mInternalCursor = musicResolver.query(musicInUri, null, null, null, null);
*/
Uri musicExUri = android.provider.MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;
Cursor mExternalCursor = musicResolver.query(musicExUri, null, MediaStore.Audio.Genres.NAME+ " like ?",
inValue, "LOWER(" + MediaStore.Audio.Genres.NAME + ") ASC");
Cursor[] cursors = {mExternalCursor};
final MergeCursor mMergeCursor = new MergeCursor(cursors);
if (mMergeCursor.moveToFirst()) {
do {
SongBeen been=new SongBeen();
long thisId= mMergeCursor.getLong(mMergeCursor.getColumnIndexOrThrow(MediaStore.Audio.Genres._ID));
String thisTrack = mMergeCursor.getString(mMergeCursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME));
been.setId(thisId);
been.setTrack(thisTrack);
genresList.add(been);
} while (mMergeCursor.moveToNext());
}
mMergeCursor.close();
return genresList;