有没有办法通过 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>)?
我正在尝试构建一个简单的音板。
以下情况:
- 我已经将 'kotlin-android-extensions' 添加到 build.gradle 文件
- 用按钮填充 activity_main.xml
- 所有按钮使用相同的方法:fun playSound()
- 所有按钮均已标记(我使用标记是为了通过传递的 view.getTag() 访问原始文件)
问题是我找不到“动态”访问 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()
传递的文件名不包含文件扩展名。
我正在尝试构建一个简单的音板。
以下情况:
- 我已经将 'kotlin-android-extensions' 添加到 build.gradle 文件
- 用按钮填充 activity_main.xml
- 所有按钮使用相同的方法:fun playSound()
- 所有按钮均已标记(我使用标记是为了通过传递的 view.getTag() 访问原始文件)
问题是我找不到“动态”访问 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()
传递的文件名不包含文件扩展名。