有没有办法阻止所有MediaPlayers?

时间:2009-12-28 15:25:31

标签: android media-player

我目前正在开发我的第一个Android应用程序,阅读Android官方网站上的Dev Documentation。我想要完成的是播放一些铃声。我的代码中的一部分是:

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”(第1个按钮的声音文件)时单击第2个按钮时,“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错误。

1 个答案:

答案 0 :(得分: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或尝试放弃释放资源。