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
相关产品推荐
相关产品推荐

