1

我有这个问题,我想播放一些音频...

我有两个按钮,“播放”和“停止”...

问题是,在我按下停止按钮,然后按下播放按钮后,没有任何反应。- 停止按钮停止歌曲,但我希望播放按钮再次播放歌曲(从头开始)这是我的代码:

final MediaPlayer mp = MediaPlayer.create(this, R.raw.megadeth);

然后是两个公共点击:

(为了玩……)

 button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
             button.setText("Playing!");
             try {
     mp.prepare();
    } catch (IllegalStateException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
             mp.start();
             //
            }
        });

为了停止轨道...

    final Button button2 = (Button) findViewById(R.id.cancel);
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

         mp.stop();
         mp.reset();

        }
    });

任何人都可以看到这个问题吗?如果可以,请您修复它...(建议)

非常感谢...

詹姆士

4

3 回答 3

1

你需要打电话prepare()preparAsync()之前start()

有关详细信息,请参阅API(查看状态图)。

于 2010-04-22T17:53:53.550 回答
1

Android文档中有一个错误,在页面中,据说您可以stop()使用“原始资源”媒体播放器,然后通过调用reset()和再次调用prepare()之前重播它start()。正如您所注意到的,这不起作用。

问题是reset()清除音频源并返回初始状态,因此您必须重新设置数据源。不幸的是,您无法设置“原始资源”数据源,因为除了create().

我不知道解决这个问题的干净方法。隐形直升机的方式效果很好,但对您的设计来说很痛苦,因为您需要每个 start() 调用的上下文:(并且涉及破坏和创建一个复杂的对象,这对于游戏等实时应用程序来说是有代价的......

另一种确保只有 create() 调用才需要上下文的方法是以这种方式停止媒体播放器:

stop()
prepare()

但如果你现在调用 start() ,它不会从头开始重新启动。您可以调用seekTo(0),但声音会从之前的播放位置产生一点噪音。

我一直在调查这件事。在原始资源上创建媒体播放器时,必须有一种干净有效的方法来停止和重新启动媒体播放器......

于 2010-10-08T19:47:32.633 回答
0

这就是我在我的程序中所做的工作。它每次都会释放媒体播放器,因为我每次调用它时都会使用不同的声音,但是它应该可以作为您使用的解决方法。

创建:

    public MediaPlayer mp=null;

开始:

    if (mp!=null){ 
            mp.reset();
            mp.release();
    }
            mp = MediaPlayer.create(test.this, soundResource);
            mp.start();

停止:

        mp.stop();

另请注意,您不需要使用 prepare 因为 create 方法已经为您调用了 prepare ( API REF )。

于 2010-04-23T08:47:32.770 回答