使用带有MediaPlayer参数和数组的onClickListener的正确方法

时间:2015-03-08 10:18:44

标签: android android-mediaplayer

我几天前开始学习,我试图让这个按钮工作,它只是一个按钮网格,每个应该播放不同的声音,但当我尝试播放任何时它崩溃,几乎所有我的代码是从这个链接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();

1 个答案:

答案 0 :(得分:0)

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