【问题标题】:Playing and Pausing Media Player on same button using only 1 Media Player instance?仅使用 1 个媒体播放器实例在同一按钮上播放和暂停媒体播放器?
【发布时间】:2014-03-12 12:55:38
【问题描述】:

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

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

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

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

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;

【问题讨论】:

    标签: android media-player


    【解决方案1】:

    MediaPlayer 是一个状态机,here 是 Doc。

    所以,首先,阅读文档,状态图显示:release() => end。

    因此,如果您想用不同的按钮控制相同的轨道,请不要调用 release(); 并在您的案例之间设置 set mp = null;

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

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

    此外,为了正确释放播放器,请先调用 reset(),然后再调用 release(),否则你会收到一条警告,提示“播放器因未处理的事件而被唤醒……”或类似的东西。

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

    总结一下:

    1. 阅读文档 :)

    2. 查看播放器的播放状态

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

    4. 完成后正确释放播放器

    希望这会有所帮助!

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

    在你的活动中(我想): 您的活动必须实现 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
        }
    }
    

    【讨论】:

    • 这样不行,我必须发布媒体播放器,这样我才能创建一个具有不同文件的新播放器并播放它。 mp = MediaPlayer.create(Sadrzaj.this, R.raw.s2);
    • 所以澄清一下,你想每次点击另一个按钮时播放一个新的声音吗?
    • 是的。但是,当我两次单击同一个按钮时,我希望它停止播放,而不是再次播放相同的声音。
    • 太棒了!这让我知道了如何去做。由于某种原因,它并没有真正起作用,但至少它让我知道了如何去做。谢谢
    【解决方案2】:

    您需要创建一个绑定到播放器的服务。该服务将是实际播放/更改曲目的服务,并且由于它们绑定了包含播放器的活动,因此将更新。

    【讨论】:

      【解决方案3】:

      你没有提供太多信息,但我会告诉你逻辑。

      if(ButtonClick % 2 == 0){
          //Start playing the music
      } else {
          //Stop playing the music
      }
      

      int i = 1;
      
                      Button.setOnClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                         if(i == 1){
                               //StartPlaying music .play();
                               i = 2
                         } else if (i==2){
                              //StopPlaying the music .stop();
                              i = 1
                         }
                  }
          });
      

      我建议你使用第二种方法。

      【讨论】:

      • 我试过你的代码,现在它需要点击 2 次才能在其他按钮上播放声音。那么它的作用:它会在任何按钮单击时停止 MP。
      【解决方案4】:

      检查媒体播放器是否正在播放,如果是,则更改您的逻辑以暂停它。否则做相反的事情。

      【讨论】:

        【解决方案5】:
                      Button.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                       if(mp.isPlaying()){
                             //StartPlaying music .play();
                            mp.pause();
                       } else {
                            mp.start();
                       }
                }
        });
        

        【讨论】:

        • 同样的事情,需要点击 2 次才能在其他按钮上播放声音。第一次点击播放声音,第二次点击停止。但是假设我在按钮 1 上播放 MP,我想在按钮 2 上播放 mp。当我点击按钮 2 时,它会完全停止媒体播放器,所以我必须再次点击才能播放
        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多