仅使用1个Media Player实例在同一按钮上播放和暂停Media Player? [英] Playing and Pausing Media Player on same button using only 1 Media Player instance?

查看:99
本文介绍了仅使用1个Media Player实例在同一按钮上播放和暂停Media Player?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序中有25个按钮,媒体播放器中有1个.我想要的是:第一次单击时播放声音.当我第二次单击以停止声音时 但是会发生什么:当我第一次单击时,它开始播放声音,当我再次单击时,它并没有停止它,而是从头开始再次播放它. 我的代码:

I have 25 buttons in my App and 1 Media Player. What I want: When I click first time to play sound. When I click second time to stop sound But what happens: When I click first time it start playing sound, when I click again, it doesn't stop it but instead it's playing it again from beginning. My code:

MediaPlayer mp;
    if(mp!=null)
                        {
                            mp.release();
                            mp=null;
                        }

                        mp = MediaPlayer.create(MainActivity.this, R.raw.s5awesomeguitar);
                        mp.start();

如何设置我的代码以在第一次单击时播放媒体播放器,在第二次单击时停止播放声音.在同一按钮上 完整代码:

How can I set my code to play Media Player on 1st click , on 2nd click stop sound. On same button Full Code:

gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

        switch (position) {
        case 0:
             if(mp!=null)
             {
                 mp.release();
                 mp=null;
             }
             else {
             mp = MediaPlayer.create(Sadrzaj.this, R.raw.s3djclubmix);
             mp.start();

             }

        break; 
            case 1:
                 if(mp!=null)
                 {
                     mp.release();
                     mp=null;
                 }
                 else {
                 mp = MediaPlayer.create(Sadrzaj.this, R.raw.s16dance);
                 mp.start();

                 }
            break;
            case 2:
                 if(mp!=null)
                 {
                     mp.release();
                     mp=null;
                 }
                 else {
                 mp = MediaPlayer.create(Sadrzaj.this, R.raw.s13ring);
                 mp.start();

                 }

                break;

推荐答案

MediaPlayer是状态机,

MediaPlayer is a state machine, here's the Doc .

因此,首先,请阅读文档,状态图显示:release()=> end.

So, first thing, read the doc, the state diagram says: release() => end.

因此,如果要使用不同的按钮控制同一音轨,请不要调用release();并在各个案例之间设置集mp = null;.

So if you want to control the same track with different buttons do not call release(); and do set set mp = null; between your cases.

Dhaval为您提供了正确的解决方案:

Dhaval has given you the right solution:

if (mp.isPlaying()) { mp.pause() } else { mp.play() }

if (mp.isPlaying()) { mp.pause() } else { mp.play() }

此外,为了正确释放播放器,请先调用reset()然后再释放(),否则您将收到警告,提示播放器因未处理的事件而醒来."或类似的东西.

Also, in order to properly release the player, call first reset() then release() or you'll get a warning saying " the player went awaing with unhandled events.." or something like that.

请确保您了解状态图,并且它会像魅力一样起作用:)

Please make sure you understand the state diagram and it wiil work like a charm :)

总结:

  1. 阅读文档:)

  1. Read the doc :)

检查播放器的播放状态

删除不必要的对release()的调用

Remove the unnecessary calls to release()

希望这会有所帮助!

好的,这就是我要做的:(它可能无法编译,我在这里只有一个文本编辑器,对不起^^)

Okay so here's what I'd do: (It might not compile, I only have a text editor here so sorry^^)

在您的活动中(我想): 您的活动必须实现onPreparedListener

In your activity(I suppose): Your activity must implement the onPreparedListener

    @Override
onCreate() {
if(mMediaPlayer == null) {
        mMediaPlayer = new MediaPlayer()
        mMediaPlayer.setOnPreparedListener(this); //registers your activity as the onPrepared Listener
    }
    ...
}

//Called back when media is ready to be played
@Override
onPrepared() {
    if(mMediaPlayer != null){
        mMediaPlayer.start();
    }
}


gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {

    switch (position) {
        case 0:
            ..
            break;
        case 1:
         if(mMediaPlayer.isPlaying() {
            mMediaPlayer.pause();
         } else {
             mMediaPlayer.reset();
             mMediaPlayer.setDataSource(Sadrzaj.this, R.raw.s16dance);
             mMediaPlayer.prepareAsync();//call back onPrepared()
             //mMediaPlayer.start();  sorry little mistake here no need to call start(); since it is called in onPrepared()
         }
         break;
         default:
            if(mMediaPlayer != null) {
                mMediaPlayer.reset();
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
            break;
    }
}

//Release the player and de listener
@Override
onDestroy() {
    if(mMediaPlayer != null) {
        mMediaPlayer.setOnPreparedListener(null);
        mMediaPlayer.reset();
        mMediaPlayer.release();
        mMediaPlayer = null
    }
}

这篇关于仅使用1个Media Player实例在同一按钮上播放和暂停Media Player?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆