Android-如何一次只允许一个MediaPlayer实例播放?

Android-如何一次只允许一个MediaPlayer实例播放?,android,audio,media-player,playing,Android,Audio,Media Player,Playing,我正在尝试创建一个简单的声卡Android应用程序,使用ListView项作为按钮。(顺便说一句,我是一个新手程序员) 这个想法是,我按下一个按钮,一个特定的声音文件播放。如果我在播放声音时按下任何按钮,它应该首先停止该声音,然后开始播放新的声音 当前播放的声音不会停止任何当前播放的声音,因此,如果我发送垃圾邮件的按钮,我会同时播放多个声音(如果我一次按太多,应用程序强制关闭) 我已尝试使用以下几种变体: if (mp.isPlaying()) { mp.stop(); } 但根据我在其他

我正在尝试创建一个简单的声卡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.

      }
    });
  }
}
但是,我无法理解“Config.PACKAGE”部分是如何工作的。我刚刚得到一个错误“包无法解析,或者不是字段”

我尝试用包名替换“PACKAGE”,同样的错误。我还尝试:

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

但是我无法准确地将“//com.mptest/”替换为什么。

考虑将MediaPlayer作为全局变量,而不是多个实例。

您可能会在中找到一个很好的引用,因为它处理一个
MediaPlayer
对象,并且您可能会在播放过程中更改内容。

不要使用全局变量。使用单例模式。这就是它的用途,因此您可以使用一个全局变量恰好有一个w/o实例


对于这种模式,有很多很好的Java代码示例,从开始,您不会出错。

全局变量
MediaPlayer
需要设置
private static
。这让我抓狂了好几次。

我本来想这样做,但我不知道初始化后如何更改每个按钮的声音文件,因为似乎没有一个mp.setDataSource()方法将R.raw.*resources文件作为参数,下一次将不会播放。问题是,为什么要使用singleton模式而不是
私有静态
变量?此URL已损坏。
try {
  mp.setDataSource(getApplicationContext(),Uri.parse("android.resource://com.mptest/" + R.raw.test2));
} catch (IOException e) {
  e.printStackTrace();
}