【问题标题】:How to use MediaStore query to get Artists without duplicates?如何使用 MediaStore 查询来获取没有重复的艺术家?
【发布时间】:2014-03-05 07:04:06
【问题描述】:

我想通过使用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);

提前致谢!

【问题讨论】:

    标签: android mediastore


    【解决方案1】:

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

    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”表。

    希望这对某人有所帮助。

    【讨论】:

    • 请问,在这种情况下,您如何获取专辑ID?
    【解决方案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 上的我的应用 播放列表管理器 中查看。我使用这种技术来选择艺术家、年份等。

    【讨论】:

    • 所以没有办法只能使用collection.contains() 来获取不重复的数据?如果您可以在查询步骤中不重复地检索,那就太好了。我也想知道为什么首先会有重复。这是错误还是故意设计。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      公共 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;
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多