有没有一种方法可以停止所有的MediaPlayer?

3

我目前正在通过阅读Android官方网站的开发文档来开发我的第一个Android应用程序。我想要实现的是播放一些铃声。我的代码中的一部分如下:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;

public class PlayRingSounds extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
}

public void PlayRingFile(View view) {       
  switch (view.getId()) {
    case R.id.Button01:
      MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
      mp1.start();
      break;
    case R.id.Button02:
      MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
      mp2.start();
      break;        
  }
}   
}

问题是当我在播放“aaa”(第一个按钮的声音文件)时点击第二个按钮,“bbb”也同时开始播放。有没有办法在“bbb”播放之前停止“aaa”,或者有没有办法停止所有媒体播放器?

更新于2009年12月30日 - 新代码如下:

   case R.id.Button01:
       if (mp2.isPlaying())
       {
           mp2.stop();
           mp2.release();
       }
       mp1.reset();
       mp1.prepare();
       mp1.start();
       break;
   case R.id.Button02:
       if (mp1.isPlaying())
       {
           mp1.stop();
           mp1.release();
       }
       mp2.reset();
       mp2.prepare();
       mp2.start();
       break;

mp1.prepare()和mp2.prepare()会出现IOException错误。


请查看我对问题的编辑,尝试使用这一系列函数调用。 - Anthony Forloney
1个回答

1
请注意:这不是最好的做法,这很马虎,这只是一个想法。
public void PlayRingFile(View view) {       
  switch (view.getId()) {
   case R.id.Button01:
    if (mp2.isPlaying()) {
       mp2.stop();    // stops the object from playing
       mp2.release(); // always a good practice to release the resource when done
     }
    MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
    mp1.start();
    break;
   case R.id.Button02:
    if (mp1.isPlaying()) {
       mp1.stop();    // stops the object from playing
       mp1.release(); // always a good practice to release the resource
     }
    MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
    mp2.start();
    break;        
 }
}

就像我说的那样,这不是最好的解决方案,特别是如果您添加了更多的按钮,那么您必须检查每个 MediaPlayer 的实例,而且肯定有更好的方法来解决这个问题。

我的建议是尝试找到一种方法来循环遍历所有的 MediaPlayer,看看它们是否打开,如果是,则释放资源并停止播放,或者也许有一种方法可以停止所有 MediaPlayer 的播放?

与此同时,我将继续寻找其他方法,希望这能指引您朝着正确的方向前进。

编辑(12/30/09):

case R.id.Button01:
   if (mp2.isPlaying())  {
       mp2.stop();
       mp2.release();
   }
   mp1.reset();
   createMPlayer1(); // used to re-initialze the mediaplayer for reuse since resources were released.
   mp1.prepare();
   mp1.start();
   break;
case R.id.Button02:
   if (mp1.isPlaying()) {
       mp1.stop();
       mp1.release();
   }
   mp2.reset();
   createMPlayer2();
   mp2.prepare();
   mp2.start();
   break;

public void createMPlayer1() {
   MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
}

public void createMPlayer2() {
   MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
}

我认为在释放资源后再次尝试访问文件时可能会引发 IOException 异常。我添加了两种方法来创建单独的原始文件,因为我相信异常是在释放资源时发生的。您可以重新初始化 MediaPlayer 或尝试不释放资源。


我还没有尝试过,但我猜 isPlaying 是关键。你关于实现循环的想法是正确的。谢谢你的回复。 - ncakmak
没问题,希望一切顺利。 - Anthony Forloney
我尝试了你的代码,它运行得很好。但是一旦mp2停止播放,它就无法重播。我修改了代码,添加了mp.reset()和mp.prepare(),但这次mp1.prepare()和mp2.prepare()出现了Unhandled exception type IOException错误。你有什么想法吗?谢谢你的时间。 - ncakmak
你能否将你的代码作为问题编辑提交,这样我就可以浏览发生了什么? - Anthony Forloney
我决定采用这个问题,因此当点击第二个按钮时,第一个按钮的声音仍在播放。但是,我从我们的对话中学到了很多。再次感谢。 - ncakmak
显示剩余5条评论

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