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

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

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

但我不能用什么来代替“//com.mptest/”。

4

4 回答 4

3

MediaPlayer需要设置全局变量private static。这已经抓住了我好几次。

于 2012-12-05T21:19:48.060 回答
2

不要使用全局。使用单例模式。这就是它的用途,这样您就可以使用全局变量来拥有一个不带任何实例的实例。

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

于 2011-06-28T17:47:23.170 回答
1

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

于 2011-03-20T10:57:49.503 回答
0

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

于 2011-03-21T13:36:33.250 回答