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

时间:2011-03-20 10:47:07

标签: android audio media-player playing

我正在尝试使用ListView项目作为按钮创建一个简单的Sound-board Android应用程序。 (顺便说一句,我是新手程序员)

我的想法是按下按钮,播放特定的声音文件。如果我在播放声音时按任何按钮,它应首先停止该声音,然后开始播放新声音。

目前声音播放时不会停止任何正在播放的声音,因此,如果我发送垃圾按钮,我会同时播放多个声音(如果我一次按下太多,应用程序强制关闭)。

我尝试过使用以下几种变体:

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无法解决,或者不是一个字段”。

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

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

但是我无法正确地代替“//com.mptest /".

5 个答案:

答案 0 :(得分:3)

需要设置全局变量MediaPlayer private static。这引起了我好几次。

答案 1 :(得分:2)

不要使用全局。使用单例模式。这就是它的用途,这样你就可以使用全局变量只有一个实例。

这个模式有很多很好的Java代码示例,从http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html开始,你就不会出错。

答案 2 :(得分:1)

考虑将MediaPlayer保留为全局变量,而不是拥有多个实例。

答案 3 :(得分:0)

您可以在VideoView Source中找到一个很好的参考,因为它处理一个MediaPlayer对象,您可以在播放期间更改内容。

答案 4 :(得分:-2)

使用服务,可以轻松停止当前音频并播放另一个音频而无需同时播放