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

求助:如何获取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"/>权限。
  • 路径校验:确认外部存储根目录下确实存在/ieltsTest/文件夹,避免路径拼写错误。
  • 重复调用处理:如果多次执行loadmp3,记得先调用listmp3.clear()清空列表,防止重复添加文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:45:33