无法获取专辑歌曲: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

