MediaPlayer:无法在客户端打开文件;错误(-38,0)等

10

我正在学习Android,创建了一个包含两个按钮的Activity:一个ToggleButton(播放/暂停)和一个Button(下一首)。我有两首歌曲希望在按下Next时进行循环播放。我有一个数组

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

我重写了我的Activity中的onClick方法。第一首歌曲播放得很好;但是在按下Next后,我得到了以下错误:

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

E/MediaPlayer(3107): start called in state 4

E/MediaPlayer(3107): error (-38, 0)

E/MediaPlayer(3107): Error (-38,0)

E/MediaPlayer(3107): error (1, -2147483648)

E/MediaPlayer(3107): Error (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;
    }
}

基本上,我会在每次点击“下一个”按钮时执行以下操作: - 重置mp (即MediaPlayer对象) - 为播放下一首歌曲设置新的数据源 - 启动mp

至于使用setOnPreparedListener或prepareAsync,我阅读了这个SO问题

我到底做错了什么?


1个回答

8

我相信你设置数据源的方式不正确。

把它修改为:

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

请注意包名后面的斜杠符号。

是的,没有注意到!另外,我将prepareAsync替换为prepare(),因为我正在播放文件(而不是流)。谢谢!! - Kedar Paranjape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接