10

我正在学习 Android,我创建了一个有两个按钮的活动:一个切换按钮(播放/暂停)和一个按钮(下一步)。我有两首歌曲想在按下 Next 时循环播放。我有一个数组

int [] songs={R.raw.song1,R.raw.song2};

我在我的活动中覆盖了 onClick。第一首歌很好听;但按下一步后,我收到以下错误:

无法在客户端打开文件,正在尝试服务器端

E/MediaPlayer(3107):在状态 4 中开始调用

E/MediaPlayer(3107): 错误 (-38, 0)

E/MediaPlayer(3107):错误 (-38,0)

E/MediaPlayer(3107): 错误 (1, -2147483648)

E/MediaPlayer(3107):错误 (1,-2147483648)

在 onCreate(Bundle...) 中,

if(mp!=null) mp.release();
  mp=MediaPlayer.create(this, songs[count]);

这是我的 onClick(View v) 方法:

public void onClick(View view) {    
    Log.v(TAG,"ID:"+view.getId());
    switch (view.getId()) {
    case R.id.playerbutton:  //ToggleButton
        if(state==0) {
            mp.start();
            state=1;
        }
        else if(state==1) {
            state=0;
            mp.pause();
        }   
    break;

    case R.id.next:  //Next button
        Log.v(TAG,"Next button pressed!");
        count=(count+1)%2;  //Have only two songs
        mp.reset();
        try {
            mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp"+songs[count]));
            mp.setOnPreparedListener(this);
            mp.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        mp.start();
    break;
    }
}

基本上,每次按下 Next 按钮时,我都会这样做: -reset mp(即 MediaPlayer 对象) -为播放下一首歌曲设置新数据源 -start mp

至于使用setOnPreparedListeneror prepareAsync,我读了这个 SO question

我哪里错了?

4

1 回答 1

8

我相信您设置的数据源错误。

将其更改为:

mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp/"+songs[count]));

注意包名后面的斜杠。

于 2013-07-26T09:10:09.577 回答