媒体播放器开始停止启动

问题描述 投票:12回答:7

我正在制作一个新的Android声音应用程序。当我点击它时,我做了一个可点击的按钮来播放声音。但我也希望它在第二次点击时停止播放声音。那部分工作正常现在这是问题,当我再次点击按钮再次播放声音时,它不播放它,媒体播放器完全停止。我在论坛上看,但我似乎找不到可以帮助我的答案。这是我的活动:

  MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
                mpButtonClick1.reset();

            }
            else {              
                mpButtonClick1.start();

            }


        }   

    });

当我尝试编写Button Click 1.prepare();我得到错误未处理的异常类型IOException

android media-player
7个回答
3
投票

使用以下代码更改您的课程:

删除reset();

初始化所有组件:

MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

     mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
     mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
             }
            else {              
                mpButtonClick1.start();
            }
         }   

    });

10
投票

尝试使用pause而不是stop

原因:如果您暂停MediaPlayer,那么您可以稍后恢复。但是,如果您使用stop,几乎任何其他方法都不起作用,您将不得不再次准备MediaPlayer(或创建一个新的)。

更多信息:herehere

PS:完成资源使用后别忘了释放内存。


8
投票

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

    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;
       }
    }
}

0
投票

你在mpButtonClick1.stop()之后调用mpButtonClick1.reset() - 不要这样做:

if (mpButtonClick1.isPlaying()) {
    mpButtonClick1.stop();
    mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}

reset()的文档说:

将MediaPlayer重置为未初始化状态。调用此方法后,您必须通过设置数据源并调用prepare()再次初始化它。

删除mpButtonClick1.reset(),它应该工作。

请记住,MediaPlayer可用作状态机,这意味着如果以错误的顺序调用方法,则会出现问题。请阅读有关MediaPlayer herehere的信息。


0
投票

根据我的经验,当我需要多次播放时,我可能需要停止一次播放才能开始另一次播放(就像多个按钮的情况一样),我只是创建了另一个播放器,确保我释放前一个播放器的资源。停止使用

mediaPlayer.stop(); 

但是对于游戏来说,使用类似这样的东西(根据你的特定需求调整日志)来创建/重新创建你的玩家:

private boolean createMediaPlayer()
{
    if (mediaPlayer!=null)
    {
        if(mediaPlayer.isPlaying())
        {
            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer=null;
        }

    }
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setVolume(1f, 1f);
    try
    {
        mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
        mediaPlayer.setDataSource(m_soundFile);
        mediaPlayer.prepare();
        return true;
        // Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
    } catch (Exception e)
    {
        Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
        Interop.logError(TAG + "-Exception: " , e);
        return false;
    }
}

而不是使用

if (createMediaPlayer())
    mediaPlayer.start();

这将确保正确释放媒体播放器使用的资源。


0
投票

一个简单的解决方案是使用暂停而不是停止和寻找到歌曲的开头。


0
投票

我知道这个问题很老,但最近在学习Android时,我也陷入困境,发现了一个非常简单的解决方案,我想与大家分享。

您可以回到起始位置,而不是试图停止或重置媒体。

mediaPlayer.seekTo(0);

作为参考,我也在下面发布我的代码:

public class MainActivity extends AppCompatActivity {

    MediaPlayer mp;

    public void play(View view) {
        mp.start();
    }

    public void pause(View view) {
        mp.pause();
    }

    public void stop(View view) {
        // this seeks to the beginning of the file
        mp.seekTo(0);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = MediaPlayer.create(this, R.raw.sample_audio);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.