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

Android如何读取外部存储所有音乐文件?ContentResolver查询返回空怎么解决

问题排查方案

1. 优先修复权限逻辑问题

你代码中调用permissionSetup()后立刻执行查询,而动态权限申请是异步操作,大概率执行查询时权限还未完成授权,导致查询无返回。

  • 首先确认AndroidManifest.xml中已经添加对应权限声明:
    <!-- API30版本适配 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 如果你后续升级targetSdk到33及以上,还需补充 -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    
  • 把歌曲查询逻辑移到权限申请成功的回调中执行,不要和权限申请方法串行调用。

2. 验证查询条件是否合理

你当前使用的筛选条件MediaStore.Audio.Media.IS_MUSIC + " != 0"会过滤掉未被系统标记为音乐的音频文件,你可以先去掉筛选条件测试是否能查到数据:

// 测试阶段先把selection参数传null
val resultSet : Cursor? = activity?.applicationContext?.contentResolver?.query(uri, projection, null, null, null)

如果去掉筛选后有返回,说明你模拟器里的音频文件没有被系统标记为音乐,或是媒体库还未扫描到你添加的音频。

3. 确认模拟器媒体库已更新

Android系统不会自动识别刚拷贝到模拟器的音频文件,你可以通过重启模拟器、或是手动发送媒体扫描广播,触发系统更新媒体库后再测试。

额外代码修复点

你当前游标取值的索引对应关系完全错位,你定义的projection顺序是[_ID, TITLE, ARTIST],现有代码把索引0赋值给url、1给artist、2给title,就算查到数据也会拿到错误值,建议修改为:

val audioId = resultSet.getLong(0)
val title = resultSet.getString(1)
val artist = resultSet.getString(2)
// 正确构造音频的访问Uri
val audioUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioId)
listSong.add(SongInfo(title, artist, audioUri.toString()))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:04