【问题标题】:Mediaplayer doesn't restart on first click after finish完成后第一次单击时 Mediaplayer 不会重新启动
【发布时间】:2017-06-27 20:42:28
【问题描述】:

使用 ViewPager 进行图像滑动,每个图像 onclick 流特定的 mp3。

以下操作正常:

1-第一次点击 ==) 播放 MP3。

1 秒点击 ==) 暂停 mp3

3-三次点击 ==) 从暂停的地方重新开始播放 mp3。

mp3完成后再次点击图片重新开始播放,第一次点击没有反应,

我尝试了许多代码变体,但都没有成功。

如有任何帮助,我们将不胜感激。

主活动

 public class MainActivity extends Activity {
 private ViewPager mViewPager;
  MediaPlayer mp;
  private int length;

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

     mViewPager= (ViewPager) findViewById(R.id.view_pager);
     ImageAdapter adapter = new ImageAdapter(this);
     mViewPager.setAdapter(adapter);

     final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener());
     mViewPager.setOnTouchListener(new View.OnTouchListener() {
         public boolean onTouch(View v, MotionEvent event) {
             tapGestureDetector.onTouchEvent(event);
             return false;
         }
     });
 }

 private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {

    @Override
   public boolean onSingleTapConfirmed(MotionEvent e) {


    if (mViewPager.getCurrentItem() == 0) {
                if(mp != null && mp.isPlaying()){
                   mp.pause();
                   length = mp.getCurrentPosition();

                  }else{

                   mp = MediaPlayer.create(MainActivity.this, R.raw.aa);     
                   mp.seekTo(length);

                   mp.start();
                   mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        public void onCompletion( MediaPlayer mp) {
                               length = mp.getCurrentPosition();

                            if(mp != null && mp.isPlaying()){
                                   mp = MediaPlayer.create(MainActivity.this, R.raw.aa);                                    
                                   mp.start(); 
                                 }
                            }
                        });
                   }
                }


     return super.onSingleTapConfirmed(e);
          }
       }
    }

【问题讨论】:

    标签: java android audio android-viewpager android-mediaplayer


    【解决方案1】:

    为什么要在 else 块中创建一个新的 MediaPlayer?那不可能是正确的。如果MediaPlayer 已创建并暂停,您只需再次调用start()。完全没有必要创建一个新的并寻找到以前的位置。

    我也不太明白您要对完成侦听器做什么。该方法的参数永远不会为空(您隐藏了名为 mp 的 MainActivity 的成员),并且它永远不应该让 isPlaying() 返回 true(这是完成的回调)。

    这只是对你想要达到的目标的猜测,我还没有测试过,但是试试这个:

    public class MainActivity extends Activity {
    
        private ViewPager mViewPager;
        MediaPlayer mp;
        private boolean isPaused;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mViewPager= (ViewPager) findViewById(R.id.view_pager);
            ImageAdapter adapter = new ImageAdapter(this);
            mViewPager.setAdapter(adapter);
    
            final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener());
            mViewPager.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                    tapGestureDetector.onTouchEvent(event);
                    return false;
                }
            });
        }
    
        private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                if (mViewPager.getCurrentItem() == 0) {
                    if (mp != null) {
                        if (isPaused) {
                            mp.start();
                            isPaused = false;
                        } else {
                            mp.pause();
                            isPaused = true;
                        }
                    } else {
                        mp = MediaPlayer.create(MainActivity.this, R.raw.aa);
                        mp.start();
                        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            public void onCompletion(MediaPlayer m) {
                                // Set the MainActivity member to null
                                MainActivity.this.mp = null;
                            }
                        });
                    }
                }
                return super.onSingleTapConfirmed(e);
            }
        }
    }
    

    请注意,我不再尝试保存当前位置,这只是不必要的。我正在保存MediaPlayer 是否暂停,这对于一般情况来说是一种合理的做法。 MediaPlayer 并不总是快速更新其状态,这可能导致 isPlaying() 返回意外值。不过,与本地播放相比,这对流媒体来说更令人担忧。

    【讨论】:

    • 完美运行,谢谢,应用程序在 50 页中有 50 张图片,每张图片点击播放不同的 MP3,我是否需要在 MainActivity 上重复 50 次,或者有更好的编码方式,抱歉 android 新手,谢谢,我的意思是重复这段代码 50 次:if(mViewPager.getCurrentItem() == 0) { if (mp != null) { if (isPaused) {mp.start(); isPaused = 假; } else { mp.pause();isPaused = true; }} 其他 { mp=MediaPlayer.create(MainActivity.this, R.raw.aa); mp.start(); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer m) {MainActivity.this.mp=null;}});}}
    • 重复代码通常是一件坏事。您如何解决此问题取决于您是否拥有 50 种不同的媒体资源,或者仅具有 50 张图像的相同资源。如果您有 50 种不同的媒体资源,或许可以使用 switch 语句将局部变量设置为资源 ID。然后在决定使用什么资源后使用MediaPlayer 逻辑。如果它是 50 张图像的相同资源,只需更改 if 语句以检查值范围而不是等价为零。
    • 请你检查我的第二个问题,我试图解决它但我不能,请任何帮助,谢谢stackoverflow.com/questions/44997764/…
    【解决方案2】:

    您确定 OnCompletionListener 是按照您希望的方式实现的吗?因为它没有真正的意义。 试试这个:

    public void onCompletion(MediaPlayer mp) {
        length = 0;
        mp = null;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多