完成后,Mediaplayer不会在第一次点击时重新启动

时间:2017-06-27 20:42:28

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

使用ViewPager滑动图像,每个图像都点击特定于mp3的流。

以下操作正常运行:

1 - 首先点击==)播放MP3。

1秒钟点击==)暂停mp3

3 - 三次点击==)继续播放暂停播放的mp3。

完成mp3后再点击图片重新启动它,从一开始它就没有响应第一次点击,

我尝试了很多代码变体而没有成功。

请任何帮助将不胜感激。

MainActivity

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

2 个答案:

答案 0 :(得分:0)

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

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

}

答案 1 :(得分:0)

为什么要在else块中创建新的MediaPlayer?这不可能是正确的。如果MediaPlayer已创建并暂停,您只需再次致电start()即可。绝对没有必要创建一个新的并寻求到以前的位置。

我也不太了解你正在尝试用完成监听器做什么。该方法的参数永远不会为null(您隐藏名为MainActivity的{​​{1}}成员),并且它永远不应该mp返回true(它'回调完成)。

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

isPlaying()

请注意,我不再尝试保存当前位置,这是不必要的。我正在保存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返回意外值。不过,对于流媒体来说,这比本地播放更受关注。