安卓MediaPlayer停止和播放

32
我正在创建一个包含2个按钮的Android应用程序,点击每个按钮会播放mp3文件。 问题在于当我点击button1时,它会播放sound1,当我点击button2时,它会播放sound2
我检查了每个按钮上的另一个播放器是否正常工作,并停止它并播放所点击的按钮。
但是,如果我连续两次单击同一按钮,则第一个音频将在后台继续播放,并再次播放另一个音频。
我尝试检查isPlaying()并停止它,但不起作用!
我希望如果我单击button1,它会播放sound1,如果再次单击它,它会停止并重新从头开始播放。
我的代码:
package com.hamoosh.playaudio;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class PlayaudioActivity extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b= (Button) findViewById(R.id.button1);
        Button b2= (Button) findViewById(R.id.button2);
        final TextView t= (TextView) findViewById(R.id.textView1);

        final MediaPlayer mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
        final MediaPlayer mp1 = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);

        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp1.isPlaying()) {

                    mp1.stop();
                }

                mp.start();
            }

        });

        b2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp.isPlaying()) {

                    mp.stop();
                }
                mp1.start();
            }
        });
    }
}

希望有更好的代码可以使用多个按钮作为数组或类似的东西,以免每次都要检查每个按钮和玩家。

6个回答

65

您应该只使用一个媒体播放器对象。

    public class PlayaudioActivity extends Activity {

        private MediaPlayer mp;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button b = (Button) findViewById(R.id.button1);
            Button b2 = (Button) findViewById(R.id.button2);
            final TextView t = (TextView) findViewById(R.id.textView1);

            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
                    mp.start();
                }

            });

            b2.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
                    mp.start();
                }
            });
        }

        private void stopPlaying() {
            if (mp != null) {
                mp.stop();
                mp.release();
                mp = null;
           }
        }
    }

@mario 我疯了似地寻找在我的应用中实现媒体播放器的方法,虽然有很多人帮助或试图帮助我,但都没有成功。你的方法解决了这个问题。我现在唯一的问题是在哪里放置代码,如何检查声音是否停止播放。一旦声音停止播放,我想显示一个按钮。我已经给你的答案点赞了。 - Si8
1
@SiKni8 你必须提出一个新问题,不能在这里回答。 - Mario
1
@mario,我已经解决了。感谢您的回复。 - Si8
如果有帮助的话,你需要想出一种方法来创建一个媒体播放器类的单个实例,以防止音频重叠。我通过在我的Android应用程序的Application实例中创建MediaPlayer对象来实现这一点。 - Damercy

9
要在不发生“非法状态异常”情况下停止媒体播放器,您需要进行以下操作:
  try {
        mp.reset();
        mp.prepare();
        mp.stop();
        mp.release();
        mp=null;
       }
  catch (Exception e)
         {
           e.printStackTrace();
         }

而不仅仅是

try {
       mp.stop();
       mp.release();
       mp=null;
    } 
catch (Exception e) 
    {
      e.printStackTrace();
    }

我之前在调用 stop() 方法时遇到了异常,但是使用你的代码替换后,现在在调用 reset()prepare() 方法时也会抛出 IllegalStateException 异常。我之前还在调用这些方法之前加了一个 isPlaying 的检查,但现在已经将其删除,只检查 mp 是否为空。在调用这些方法之前还有其他的 mp 检查吗? - waseefakhtar
它在第一行崩溃了:mp.reset() -> IllegalStateException - Senocico Stelian

5
根据MediaPlayer的生命周期,您可以在Android API指南中查看。我认为您需要调用reset()而不是stop(),之后再次准备媒体播放器(仅使用一个)以从头开始播放声音。同时还要考虑到声音可能已经结束了。因此,我建议实现setOnCompletionListener()以确保如果您尝试重新播放声音,它不会失败。

1

我可能没有正确理解你的答案,但你可以尝试这个:

public void MusicController(View view) throws IOException{
    switch (view.getId()){
        case R.id.play: mplayer.start();break;
        case R.id.pause: mplayer.pause(); break;
        case R.id.stop:
            if(mplayer.isPlaying()) {
                mplayer.stop();
                mplayer.prepare(); 
            }
            break;

    }// where mplayer is defined in  onCreate method}

由于只有一个线程在处理所有事情,因此stop()方法会使其死亡,因此我们必须再次准备它。如果您想在按下开始按钮后重新启动它(它会抛出IO异常),或者为了更好地理解MediaPlayer,您可以参考Android 媒体播放器


0

以防有人来到这个问题,我有更简单的版本。

public static MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button) findViewById(R.id.button);
        Button b2 = (Button) findViewById(R.id.button2);


        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mp = MediaPlayer.create(MainActivity.this, R.raw.game);
                mp.start();
            }
        });

        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
               // mp.start();
            }
        });
    }

可以在同一个按钮上启动和停止。 - bhupathi turaga

0
Kotlin 中:

1- 上层类添加一个变量:

var mpo: MediaPlayer? = null

2- 在onCreate或函数中

mpo = MediaPlayer.create(this, R.raw.m7)
            mpo!!.start()

3- 在控件下添加停止,可以是onClick或任何命令:

if (mpo != null) {
                mpo!!.stop()
                mpo!!.release()
                mpo = null
        }

请注意,对于每个玩家,需要单独设置其停止点!


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