【问题标题】:Why can I getIdentifier of mp3 file in raw but not programmatically and how to fix it?为什么我可以原始但不能以编程方式获取 mp3 文件的标识符以及如何修复它?
【发布时间】:2019-02-12 00:58:48
【问题描述】:

我已经开始开发一个 Android 应用程序,对此我很陌生。 我的应用程序必须读取一些二维码,目前我正在使用 zxing 库。 现在我在应用程序的一部分中遇到了一些问题,涉及播放存储在 /res/raw 中的声音:

我的代码有时会运行......但大多数时候它不会运行

我可以使用以下代码访问原始文件夹中的一些声音文件:

var myPlayer = MediaPlayer.create(this, R.raw.filename)

但不通过变量调用我需要的文件:

var myVarWithFilenameInside: String = "filename"        
var myFileInt: Int = resources.getIdentifier("$myVarWithFilenameInside", "raw", this.getPackageName())
var myPlayer = MediaPlayer.create(this, myFileInt)

(即使显然是“随机”的,这似乎偶尔也会起作用;确实很奇怪..)

我已经尝试不指定变量的类型并插入 packageName(如 IDE 所建议的那样)而不是 this.getPackageName()...但是似乎没有任何效果

PS。 该指令也可以完美运行,但是我必须再次获取标识符而不使用变量,而是手动将其放入方法中

var myFileInt: Int = resources.getIdentifier("filename", "raw", this.getPackageName())
var myPlayer = MediaPlayer.create(this, myFileInt)

我对此非常困惑...因此,我们将不胜感激任何形式的帮助 提前致谢

【问题讨论】:

  • 程序化是什么意思?两者都是程序化的。您不能对任何随机文件名或路径使用第二种方法。如果有文件不在应用的原始文件夹中,则需要使用 DocumentsProvider。
  • 我的意思是在工作案例中,我必须设置一个长长的 if 语句列表,以便如果一个字符串包含想要的文件(它们都在 /Res/raw 中),那么它会触发正确的语句文件名明确。
  • 但是我需要将选择的文件名存储到一个var中,获取标识符然后创建一个指向我需要的文件的媒体播放器对象。
  • 我不知道为什么如果我通过文件名调用同一个文件会被正确寻址(参见主帖),但如果我尝试调用它,它会给我一个 IOException of file not found使用变量。
  • 我更新了问题以使其更清晰

标签: java android android-studio kotlin resources


【解决方案1】:

假设 raw 文件夹中有一个文件 filename.mp3,这对我有用:

var myVarWithFilenameInside = "filename"
var myFileInt: Int = resources.getIdentifier(myVarWithFilenameInside, "raw", this.packageName)
var myPlayer: MediaPlayer = MediaPlayer.create(this@YourActivity, myFileInt)
myPlayer.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2010-12-24
    • 2015-01-10
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多