安卓使用MediaPlayer播放声音的问题

qq_33576705 2016-10-18 02:12:48
网上找了一个简单的例程,代码如下

private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mp = MediaPlayer.create(this, R.raw.xjwq);
mp.start();
mp.setLooping(true);
}


这样是能够正常播放的。

然后我就想做一个按钮来切换这个播放的声音。
我这么做了,


private MediaPlayer mp1;
private MediaPlayer mp2;
private MediaPlayer mp3;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mp1 = MediaPlayer.create(this, R.raw.xjwq);
mp2 = MediaPlayer.create(this, R.raw.bg);
mp3 = MediaPlayer.create(this, R.raw.xghzj);

mp1.start();
mp1.setLooping(true);
}


然后在按钮内执行

switch(mpIndex)
{
case 0:
mp1.stop();
break;
case 1:
mp2.stop();
break;
case 2:
mp3.stop();
break;
}

mpIndex ++;
if(mpIndex == 3) mpIndex = 0;
if(mpIndex == 0)
{
mp1.start();
mp1.setLooping(true);
}
else if(mpIndex == 1)
{
mp2.start();
mp2.setLooping(true);
}
else
{
mp3.start();
mp3.setLooping(true);
}


我就想循环的播放资源文件里面的3个文件,这种方式报错


ERROR/MediaPlayer(9974): start called in state 64
ERROR/MediaPlayer(9974): error (-38, 0)
ERROR/MediaPlayer(9974): Error (-38,0)


请问怎么做?
...全文
497 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33576705 2016-10-18
  • 打赏
  • 举报
回复
引用 3 楼 kokobobo 的回复:
[quote=引用 2 楼 qq_33576705 的回复:] [quote=引用 1 楼 kokobobo 的回复:] start前要记得prepare,比如这样

mpArr.get(mpIndex%3).stop();
mpArr.get(mpIndex%3).prepare();
mpIndex++;
谢谢,我百度了下,发现如果只是使用mp.pause的话,就可以再使用mp.start来开启。 暂时这么使用了没问题。 而你说说的这个prepare();它的对象应该不是create出来的是new出来的。因此可能存在差异。[/quote] create得到的对象是处于prepare状态的,所以第一次调用时不需要prepare,但你在代码中stop后再次调用就必须先prepare。 实际上create方法就是在内部new一个对象然后调用setDataSource、prepare再返回给你罢了,对象本身没什么区别。[/quote] 哦哦 ,刚学,看来我理解错了哈哈。 只是我在thread里面使用mp.prepare方法的时候报错,我还以为我这个mp对象不能用prepare。所以理解成了这两个对象不同。
KIAE 2016-10-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_33576705 的回复:
[quote=引用 1 楼 kokobobo 的回复:] start前要记得prepare,比如这样

mpArr.get(mpIndex%3).stop();
mpArr.get(mpIndex%3).prepare();
mpIndex++;
谢谢,我百度了下,发现如果只是使用mp.pause的话,就可以再使用mp.start来开启。 暂时这么使用了没问题。 而你说说的这个prepare();它的对象应该不是create出来的是new出来的。因此可能存在差异。[/quote] create得到的对象是处于prepare状态的,所以第一次调用时不需要prepare,但你在代码中stop后再次调用就必须先prepare。 实际上create方法就是在内部new一个对象然后调用setDataSource、prepare再返回给你罢了,对象本身没什么区别。
qq_33576705 2016-10-18
  • 打赏
  • 举报
回复
引用 1 楼 kokobobo 的回复:
start前要记得prepare,比如这样

mpArr.get(mpIndex%3).stop();
mpArr.get(mpIndex%3).prepare();
mpIndex++;
谢谢,我百度了下,发现如果只是使用mp.pause的话,就可以再使用mp.start来开启。 暂时这么使用了没问题。 而你说说的这个prepare();它的对象应该不是create出来的是new出来的。因此可能存在差异。
KIAE 2016-10-18
  • 打赏
  • 举报
回复
start前要记得prepare,比如这样

mpArr.get(mpIndex%3).stop();
mpArr.get(mpIndex%3).prepare();
mpIndex++;

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧