将 onClickListener 与 MediaPlayer 参数和数组一起使用的正确方法

Correct way to use onClickListener with MediaPlayer parameters and an array

我几天前开始学习,我试图让这个按钮工作,它只是一个按钮网格,每个按钮应该播放不同的声音,但是当我尝试播放任何一个时它崩溃了,几乎所有我代码来自这个 link http://www.stealthcopter.com/blog/2010/09/android-creating-a-custom-adapter-for-gridview-buttonadapter/ 并且 onClick 代码是这个,但是它不起作用。


        public void onClick(View v)
        {
            // Preform a function based on the position

            if(mp!=null){
                mp.stop();
                mp.release();}
            Uri uri = Uri.parse(filenames[this.position]);
            mp = MediaPlayer.create(MainActivity.this, uri);
            mp.start();

这是我在 logcat

中得到的错误
    03-08 06:38:31.789  11339-11349/com.ntugta.hellogridview E/MediaPlayer﹕ error (1, -2147483648)
    03-08 06:38:31.805  11339-11339/com.ntugta.hellogridview D/MediaPlayer﹕ create failed:
    java.io.IOException: Prepare failed.: status=0x1
    at android.media.MediaPlayer.prepare(Native Method)
    at android.media.MediaPlayer.create(MediaPlayer.java:812)

忘记补充了,播放文件的数组是这样的

public String[] filesnames = { 
        "R.raw.file1", 
        "R.raw.file2",
        "R.raw.file3"
        };

编辑: 不得不将名称文件更改为这种播放方式。

public String[] filesnames = { 
        "file1", 
        "file2",
        "file3"
        };

编辑:

我找到了解决方法,第一个问题是 if 上的错误状态,它是 .reset();我应该运行,而不是.stop()和.release(),第二个错误是Uri,它应该是一个资源标识符,基于我从数组中得到的字符串,这是最后一个代码。

String data = filenames[this.position];
if (m != null) {
m.reset();
}
m = MediaPlayer.create(MainActivity.this,getResources().getIdentifier(data, "raw", "com.example.package"));
m.start();

创建失败,返回null。你没有检查这个,所以当你调用 mp.start 时你崩溃了。首先,您应该检查 mp.create 是否返回 null,如果返回 null,则不要调用 start。其次,你不能那样做弦乐。 R.raw.xxx 不是文件名。它是一个资源 ID,指的是您可以通过 openResource 打开的资源。您需要将数据放在可以获取 FileDescriptor 的地方,例如资产目录。