有没有办法通过 MediaPlayer.create() 动态访问 res/raw 的文件而不是设置静态路径(例如 R.raw.<filename>)?

Is there a way to access the files of res/raw dynamically via MediaPlayer.create() instead of setting a static path (e.g. R.raw.<filename>)?

我正在尝试构建一个简单的音板。

以下情况:

问题是我找不到“动态”访问 res/raw-files 的方法,因为 MediaPlayer.create() 需要文件的静态路径(例如“R.raw.filename").

代码应该看起来像这样,但是 .create 不接受变量(变量“路径”)而是要求静态路径(例如“R.raw.filename”)。

fun playSound(view: View) {
        var path: String = "R.raw." + view.getTag()
        mediaPlayer = MediaPlayer.create(applicationContext, path)
        mediaPlayer.start()
}

我试图用“resid”(将文件放入 res/raw 文件夹时分配给文件的整数)解决问题,但没有用(应用程序总是崩溃)。 我搜索了很多,但我找到的唯一解决方案对我没有帮助,我不再知道要寻找什么,也不知道问题是否可以解决。

提前致谢!

您可以使用 resources.getIdentifier()raw 文件夹按名称找到资源 ID,它可以在 MediaPlayer.create(applicationContext, resId) 中使用,如下所示:

fun playSound(view: View) {
    val fileNameWithoutExtension: String = view.getTag() as String
    val resId = resources.getIdentifier(fileNameWithoutExtension, "raw", packageName)
    if (resId != 0) {
        val mediaPlayer = MediaPlayer.create(applicationContext, resId)
        mediaPlayer.start()
    }
}

确保您使用 view.getTag() 传递的文件名不包含文件扩展名。