求助:如何获取Android指定文件夹下的所有.mp3文件?
问题排查与修复方案
核心问题分析
- 函数重载缺失:递归调用时传入了路径参数
loadmp3(f.absolutePath),但原函数是无参的,导致递归遍历子文件夹的逻辑完全没执行。 extensions变量未定义:代码中依赖extensions数组判断文件后缀,但未初始化该变量,无法识别MP3文件。- Android版本适配问题:
Environment.getExternalStorageDirectory()在Android 10及以上版本中,直接访问外部存储会受到权限限制,可能导致文件读取失败。 - 遍历逻辑冗余:原代码用嵌套循环判断后缀,写法繁琐且容易出错。
修复后的代码
private val listmp3 = ArrayList<String>() // 明确定义要筛选的音频后缀 private val extensions = arrayOf(".mp3") private fun loadmp3(folderPath: String = Environment.getExternalStorageDirectory().path + "/ieltsTest/") { val file = File(folderPath) // 先检查文件夹是否存在 if (!file.exists()) { Log.w("audioList", "目标文件夹不存在:$folderPath") return } if (file.isDirectory) { file.listFiles()?.forEach { f -> if (f.isDirectory) { // 递归遍历子文件夹 loadmp3(f.absolutePath) } else { // 简化后缀判断逻辑,统一转小写避免大小写问题 if (extensions.any { f.name.lowercase().endsWith(it) }) { listmp3.add(f.absolutePath) } } } } Log.i("audioList", "共找到${listmp3.size}个MP3文件:$listmp3") }
额外注意事项
- 权限适配:
- Android 9及以下:在Manifest中添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>,并动态申请权限。 - Android 10-12:除上述权限外,需在Manifest的
application标签中添加android:requestLegacyExternalStorage="true",或改用MediaStore API查询文件。 - Android 13+:申请
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>权限。
- Android 9及以下:在Manifest中添加
- 路径校验:确认外部存储根目录下确实存在
/ieltsTest/文件夹,避免路径拼写错误。 - 重复调用处理:如果多次执行
loadmp3,记得先调用listmp3.clear()清空列表,防止重复添加文件。
内容的提问来源于stack exchange,提问作者Aashis
相关产品推荐
相关产品推荐

