Android MediaPlayer 停止和播放

Posted

技术标签:

【中文标题】Android MediaPlayer 停止和播放【英文标题】:Android MediaPlayer Stop and Play 【发布时间】:2012-08-29 06:59:28 【问题描述】:

我正在创建包含 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();
            
        );
    

希望是否有更好的代码可以将多个按钮用作数组或不每次都检查每个按钮和播放器的东西。

【问题讨论】:

【参考方案1】:

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

    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 我疯狂地寻找一种在我的应用程序中实现媒体播放器的方法,尽管很多人都在帮助或至少试图帮助我但没有成功。你成功了。我现在唯一的问题是在哪里放置代码,在哪里/如何检查声音是否停止播放。一旦声音停止播放,我想显示一个按钮。我赞成你的回答。 @SiKni8 你要问一个新问题,这里不能回答 @mario 我想通了。感谢您的回复。 如果它对任何人有帮助,您需要找到一种方法来创建 Media Player 类的单个实例,以防止音频重叠。我通过在我的 android 应用的 Application 实例中创建 MediaPlayer 对象来实现这一点。【参考方案2】:

要停止媒体播放器而不会有非法状态异常的风险,您必须这样做

  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 检查? 它在第一行崩溃:mp.reset() -> IllegalStateException【参考方案3】:

根据MediaPlayer生命周期,你可以在Android API guide中查看,我认为你必须调用reset()而不是stop(),然后再准备媒体播放器(只使用一个) 从头开始​​播放声音。还要考虑到声音可能已经结束。所以我还建议实施setOnCompletionListener() 以确保如果您再次尝试播放声音,它不会失败。

【讨论】:

【参考方案4】:

我可能没有得到你的正确答案,但你可以试试这个:

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 Media Player

【讨论】:

【参考方案5】:

万一有人提出这个问题,我有更简单的版本。

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();
            
        );
    

【讨论】:

可以在同一个按钮上开始和停止

以上是关于Android MediaPlayer 停止和播放的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio Java MediaPlayer 只播放音频的第一秒然后停止

Android开发---MediaPlayer简单音乐播放器

Android多媒体功能开发——使用MediaPlayer类播放音频

Android MediaPlayer 背景音乐线程随机停止

Android开发---MediaPlayer简单音乐播放器

在 mediaplayer 中播放的 Android webview 视频