Android - 如何只允许一个MediaPlayer实例在同一时间播放?

4
我是一名初级程序员,正在尝试创建一个简单的Sound-board Android应用程序,使用ListView项目作为按钮。
我的想法是按下按钮后会播放特定的声音文件。如果我在播放声音时按下任何按钮,它应该先停止当前正在播放的声音,然后开始播放新的声音。
目前,声音播放时不会停止正在播放的任何声音,因此如果我连续按下按钮,就会同时播放多个声音(如果我一次按下太多按钮,应用程序会强制关闭)。
我已经尝试过几种变化:
if (mp.isPlaying()) {
  mp.stop();
}

但是根据我在其他几个来源上读到的内容,我正在创建多个MediaPlayer类的实例,即使它们具有相同的名称,stop()方法也会尝试停止mp的最新实例(在某些情况下,它甚至还没有被创建)。
我猜测我的MediaPlayer类的一般实现是错误的,但这是我能想出来的最好的解决办法。
无论如何,这是相关的代码块:
public class soundTest extends Activity {
  private ListView lv1;
  private String lv_arr[]={"test 1","test 2","test 3","test 4","test 5"};

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    lv1=(ListView)findViewById(R.id.ListView01);
    lv1.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, lv_arr));

    lv1.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) {

        if (lv1.getItemAtPosition(position)=="test 1") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound1);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        if (lv1.getItemAtPosition(position)=="test 2") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound2);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        //And the rest of the sounds 3,4,5.

      }
    });
  }
}

希望能得到您的帮助,谢谢。

编辑(3月22日):

我找到了以下代码片段,应该可以工作:

mp.setDataSource(context, Uri.parse("android.resource://" + Config.PACKAGE + "/" + resId));

但是,我无法理解"Config.PACKAGE"部分的工作原理。我只得到一个错误提示"PACKAGE cannot be resolved, or is not a field"。

我尝试将"PACKAGE"替换为包名,但是仍然出现相同的错误。我还尝试了以下方法:

try {
  mp.setDataSource(getApplicationContext(),Uri.parse("android.resource://com.mptest/" + R.raw.test2));
} catch (IOException e) {
  e.printStackTrace();
}

但是我不确定要把"//com.mptest/"替换成什么。

4个回答

3
全局变量 MediaPlayer 需要设置为 private static。这已经让我犯了好几次错误。

当我尝试使用静态时,下一次它就无法播放了...这是问题的链接 http://stackoverflow.com/questions/18173826/music-player-playing-multiple-songs-at-the-same-time - Ankit Srivastava

2

为什么要使用单例模式而不是private static变量? - Flimm

1

考虑将您的MediaPlayer作为全局变量而不是拥有多个实例。


1
我一开始就想这么做,但是我不知道如何在初始化后为每个按钮更改声音文件,因为似乎没有一个mp.setDataSource()方法可以将R.raw.*资源文件作为参数。 - Goran

0

你可以在VideoView 源代码中找到一个很好的参考,因为它处理了一个MediaPlayer对象,并且您可以在播放过程中更改内容。


此URL已失效。 - Dipali Shah

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