You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询SD卡音乐专辑出现重复条目问题求助

解决SD卡专辑重复显示的问题

嘿,我明白你遇到的麻烦了——同一专辑因为包含多个艺术家,结果在列表里重复出现N次,这确实很影响体验。咱们来一步步搞定它!

问题根源

你当前查询的MediaStore.Audio.Albums会把同一专辑但关联不同艺术家的内容拆分成独立条目。媒体库的这个设计是为了适配合辑类专辑的细分展示,但不符合你想要的“一个专辑只显示一次”的需求。

解决方案:代码层面去重(最稳妥兼容)

最简单的办法是在遍历Cursor时,维护一个已处理的专辑ID集合,确保每个专辑只被添加一次。具体修改你的代码:

  1. 先声明一个HashSet来记录已经处理过的专辑ID:
Set<Long> processedAlbumIds = new HashSet<>();
  1. 在循环里添加判断,只处理未见过的专辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:32