如何使用MediaStore查询来获取没有重复的艺术家?

时间:2014-03-05 07:04:07

标签: android mediastore

我希望使用MediaStore获取手机上的所有艺术家姓名;我已经拥有整个列表,但由于多个链接歌曲/艺术​​家,所有条目都有重复。有没有办法使用查询只获取其中一个,没有任何重复?

有我的疑问:

    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

    String[] projection = {
            MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.DURATION
    };
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            null,
            null);

提前致谢!

4 个答案:

答案 0 :(得分:4)

对于仍在寻找答案的人,我建议您执行以下操作:

String[] mProjection =
         {
                MediaStore.Audio.Artists._ID,
                MediaStore.Audio.Artists.ARTIST,
                MediaStore.Audio.Artists.NUMBER_OF_TRACKS,
                MediaStore.Audio.Artists.NUMBER_OF_ALBUMS
         };

Cursor artistCursor = mContentResolver.query(
                MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
                mProjection,
                null,
                null,
                MediaStore.Audio.Artists.ARTIST + " ASC");  

现在您可以查询此光标以获取所有艺术家的名称。不会有任何重复 我知道这不是“从MediaStore获取唯一值”的解决方案。但它会解决这个非常具体的问题。

<强>解释
您只需要查询正确的表,在本例中是“Artist”表,而操作系统正在查询“Media”表。

希望这有助于某人。

答案 1 :(得分:2)

在查询中使用关键字DISTINCT返回非重复值 例如,在查询许多音频编号时仅列出专辑名称

        new String[] { "DISTINCT " + MediaStore.Audio.Playlists.Members.ALBUM_ID + " as _id"}

但我发现你只能返回一列

我保持简单,并在循环光标时执行以下操作。传递价值,就艺术家而言,

    if (value.length() > 0) {
        // check if value already exists
        if (!listItems.contains(value)) {
            // doesn't exist, add it
            listItems.add(value);
        }

    }

这是一种简单的方法。 您可以在我的Google Play应用播放列表管理器中查看此信息。我使用这种技术来选择艺术家,年份等。

答案 2 :(得分:0)

为了避免这个问题,我在创建表时使用了关键字“UNIQUE”。

答案 3 :(得分:0)

public ArrayList getAlbumList(){

            ArrayList<SongBeen> albumList=new ArrayList<SongBeen>();
            ContentResolver musicResolver = activity.getContentResolver();
            Uri musicUri = android.provider.MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
            Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
            if(musicCursor!=null && musicCursor.moveToFirst()){

                int titleColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.TITLE);
                int idColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media._ID);
                int artistColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ARTIST);
                int albumColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ALBUM);


                //add songs to list
                do {
                    SongBeen been=new SongBeen();


                    been.setId(musicCursor.getLong(idColumn));
                    been.setAlbum(musicCursor.getString(albumColumn));
                    been.setArtist(musicCursor.getString(artistColumn));


                    albumList.add(been);
            } 
                while (musicCursor.moveToNext());
            }
            return albumList;

        }