Android API 35模拟器中Directory.listSync仅返回.thumbnails无法读取MP3文件
解决Android API35模拟器无法读取Music目录MP3文件的问题
适配API33+的媒体权限
API33及以上版本中,READ_EXTERNAL_STORAGE权限已被弃用,读取音频文件需要申请READ_MEDIA_AUDIO权限。你之前申请的READ_EXTERNAL_STORAGE和mediaLibrary权限无法覆盖API35下的音频读取需求,需要替换为明确申请READ_MEDIA_AUDIO。验证权限授予状态
在代码中检查权限是否真的被授予,避免假阳性:val hasAudioPermission = ContextCompat.checkSelfPermission( context, Manifest.permission.READ_MEDIA_AUDIO ) == PackageManager.PERMISSION_GRANTED如果未授予,需要发起权限请求:
ActivityResultContracts.RequestPermission().launch(Manifest.permission.READ_MEDIA_AUDIO)放弃直接目录遍历,改用MediaStore查询
API30+启用的Scoped Storage限制了应用对外部存储目录的直接访问,即使有权限,直接调用Directory.listSync()也无法获取非应用创建的文件。正确的做法是通过MediaStore查询音频文件:val audioProjection = arrayOf( MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA ) // 筛选Music目录下的音频文件 val selection = "${MediaStore.Audio.Media.RELATIVE_PATH} LIKE ?" val selectionArgs = arrayOf("Music/%") context.contentResolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioProjection, selection, selectionArgs, null )?.use { cursor -> val nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME) while (cursor.moveToNext()) { val fileName = cursor.getString(nameColumn) // 处理每个MP3文件 } }验证模拟器文件状态
确认MP3文件确实已成功存入模拟器的Music目录:- 使用模拟器自带的文件管理器查看文件是否存在
- 通过adb命令验证:
adb shell ls /storage/emulated/0/Music,确保输出中包含你的MP3文件 - 若文件刚放入,重启模拟器触发媒体库索引更新,否则MediaStore可能无法立即查到文件
内容的提问来源于stack exchange,提问作者Arcus
相关产品推荐
相关产品推荐

