查询SD卡音乐专辑出现重复条目问题求助
解决SD卡专辑重复显示的问题
嘿,我明白你遇到的麻烦了——同一专辑因为包含多个艺术家,结果在列表里重复出现N次,这确实很影响体验。咱们来一步步搞定它!
问题根源
你当前查询的MediaStore.Audio.Albums会把同一专辑但关联不同艺术家的内容拆分成独立条目。媒体库的这个设计是为了适配合辑类专辑的细分展示,但不符合你想要的“一个专辑只显示一次”的需求。
解决方案:代码层面去重(最稳妥兼容)
最简单的办法是在遍历Cursor时,维护一个已处理的专辑ID集合,确保每个专辑只被添加一次。具体修改你的代码:
- 先声明一个
HashSet来记录已经处理过的专辑ID:
Set<Long> processedAlbumIds = new HashSet<>();
- 在循环里添加判断,只处理未见过的专辑ID:
if (cursor != null) { if (cursor.moveToFirst()) { do { id = cursor.getLong(cursor.getColumnIndex(_id)); // 核心:检查这个专辑是否已经添加过 if (!processedAlbumIds.contains(id)) { processedAlbumIds.add(id); String name = cursor.getString(cursor.getColumnIndex(album_name)); Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); albumArtUri = ContentUris.withAppendedId(sArtworkUri, id).toString(); totalSongs = cursor.getString(cursor.getColumnIndex(totSongs)); ArtistName = cursor.getString(cursor.getColumnIndex(artist_Name)); AlbumsModel s = new AlbumsModel(id, name, albumArtUri, totalSongs, ArtistName); AlbumsList.add(s); } } while (cursor.moveToNext()); } cursor.close(); }
进阶:点击专辑后展示所有歌曲
现在专辑只显示一次了,接下来要实现“点击专辑查看所有歌曲”的功能。你需要针对选中的专辑ID,查询该专辑下的全部歌曲:
// 假设点击时获取到当前专辑的id:albumId Uri songContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; // 定义要查询的歌曲字段 String[] songColumns = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA }; // 筛选条件:只获取当前专辑的歌曲 String selection = MediaStore.Audio.Media.ALBUM_ID + " = ?"; String[] selectionArgs = {String.valueOf(albumId)}; Cursor songCursor = getActivity().getContentResolver().query( songContentUri, songColumns, selection, selectionArgs, null // 可以按标题排序:MediaStore.Audio.Media.TITLE + " ASC" ); // 遍历songCursor,把歌曲数据添加到列表中 if (songCursor != null && songCursor.moveToFirst()) { do { // 提取歌曲信息,比如标题、艺术家等 String songTitle = songCursor.getString(songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); String songArtist = songCursor.getString(songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); // ... 其他字段 } while (songCursor.moveToNext()); songCursor.close(); }
备选方案:查询时直接分组
如果你想从查询层面解决,也可以在query方法的排序参数里加入分组逻辑,但要注意部分设备的兼容性:
Cursor cursor = getActivity().getContentResolver().query( uri, columns, null, null, _id + " GROUP BY " + _id // 按专辑ID分组,确保每个ID只返回一条记录 );
不过这种方法在某些Android版本上可能会有SQL语法兼容问题,所以更推荐用前面的HashSet去重方案。
内容的提问来源于stack exchange,提问作者Rektirino
相关产品推荐
相关产品推荐

