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

无法获取专辑歌曲:Android应用查询结果全为0的问题求助

解决Android获取专辑歌曲查询结果为0的问题

我来帮你排查下这个问题,通常查询结果为0大概率是权限、查询条件或者Cursor处理的问题,咱们一步步拆解解决:

  • 权限缺失导致无数据访问权限
    Android 6.0及以上版本需要动态申请媒体读取权限:Android 12及以下用READ_EXTERNAL_STORAGE,Android 13+则要换成READ_MEDIA_AUDIO。你得先确认两个点:一是在AndroidManifest.xml里声明了对应权限,二是在App运行时主动请求了权限并得到用户授权。没有权限的话,ContentResolver根本查不到任何媒体数据。

  • 查询条件或Uri设置错误
    从你的代码片段来看,查询专辑歌曲时需要明确筛选ALBUM_ID匹配目标专辑的条件,并且要使用正确的Uri:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。如果你的查询没有加ALBUM_ID = ?的筛选条件,或者Uri用错了,就会查不到对应专辑的歌曲。

  • Cursor未正确移动到有效行
    获取到Cursor后,必须先调用cursor.moveToFirst()判断是否有数据。如果返回true才说明有可读取的内容,很多人会直接跳过这一步去取数据,导致看起来结果为0。

  • Android 10+的路径字段限制(不影响结果数量,但需注意)
    如果你用的是Android 10(API 29)及以上系统,MediaStore.Audio.Media.DATA列可能无法返回真实文件路径,但这不会导致查询结果为空,只是路径字段无效。如果你的代码里没有依赖这个字段,就不用太担心,但如果筛选条件用到它,就会出问题。

修正后的示例代码

public void loadAlbumSongs(long targetAlbumId) {
    // 先确保已经获取到媒体读取权限,这里省略权限申请逻辑
    String[] songProjection = {
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.ALBUM_ID,
        MediaStore.Audio.Media._ID
    };
    // 筛选条件:只查询目标专辑ID的歌曲
    String selection = MediaStore.Audio.Media.ALBUM_ID + " = ?";
    String[] selectionArgs = {String.valueOf(targetAlbumId)};

    Cursor songCursor = getContentResolver().query(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        songProjection,
        selection,
        selectionArgs,
        null
    );

    if (songCursor != null) {
        if (songCursor.moveToFirst()) {
            do {
                // 安全获取列索引,避免列名拼写错误
                int nameIndex = songCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
                String songName = songCursor.getString(nameIndex);
                
                int albumIdIndex = songCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID);
                long albumId = songCursor.getLong(albumIdIndex);
                
                // 这里处理你的歌曲数据,比如加入列表
                Log.d("AlbumSong", "歌曲名:" + songName + ",所属专辑ID:" + albumId);
            } while (songCursor.moveToNext());
        } else {
            Log.d("AlbumSong", "该专辑下没有找到歌曲");
        }
        // 务必关闭Cursor,避免内存泄漏
        songCursor.close();
    }
}

额外注意事项

  • 确保你从专辑Cursor里获取的ALBUM_ID是正确的,要从MediaStore.Audio.Albums._ID列读取数值,别搞错列名。
  • Android 13+的权限要更新为<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />,并且动态申请时要适配新权限。
  • 处理Cursor时尽量用getColumnIndexOrThrow(),如果列名拼写错误会直接抛出异常,方便你排查问题。

内容的提问来源于stack exchange,提问作者devesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:31