媒体播放器在完成后第一次点击时不会重新启动

Mediaplayer doesn't restart on first click after finish

使用 ViewPager 进行图片滑动,每张图片点击流特定的 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);
          }
       }
    }

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

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

}

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

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

这只是对您要实现的目标的猜测,我还没有测试过,但试试这个:

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() return 出现意外值。不过,与本地播放相比,流媒体更值得关注。