在android Mediastore中查询音乐文件的艺术家名称

时间:2010-07-28 17:01:55

标签: android

我对如何实现这个问题感到遗憾,因为Content Provider URI查询不支持简单的SQL“DISTINCT”查询方法将游标返回到mediastore中歌曲的Artists,删除任何重复的条目。

我可以向所有艺术家查询并获取光标,我只是如何删除欺骗,或者根本不显示它们。

我已经尝试使用matrixcursor来构造一个删除了dupe条目的新游标,但它很慢(构建一个艺术家数组,如果在该数组中不复制到新的matrixcursor等)。

任何人都可以推荐更好的解决方案,或者指出正确的方向吗?

我还考虑过将所需信息预先加载到一个对象数组中 - 我只关心应用程序中的内存开销。

感谢您提供的任何帮助。

3 个答案:

答案 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;