Java Mediaplayer没有';完成后,第一次单击时不能重新启动

Java Mediaplayer没有';完成后,第一次单击时不能重新启动,java,android,audio,android-viewpager,android-mediaplayer,Java,Android,Audio,Android Viewpager,Android Mediaplayer,用于图像滑动的ViewPager,每个图像都单击特定于流的mp3 以下操作正常工作: 第一次单击==)播放MP3 1秒单击==)暂停mp3 第三次单击==)从暂停的位置重新播放mp3 mp3播放完毕后,再次单击图像以从一开始就重新启动它,但它不会响应第一次单击 我尝试了许多代码变体,但都没有成功 如果您有任何帮助,我们将不胜感激 主要活动 public class MainActivity extends Activity { private ViewPager mViewPager;

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

以下操作正常工作:

第一次单击==)播放MP3

1秒单击==)暂停mp3

第三次单击==)从暂停的位置重新播放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()
。绝对没有必要创造一个新的,并寻求到以前的立场

我也不太明白你想用完成监听器做什么。方法的参数永远不会为null(您正在隐藏名为
mp
MainActivity
的成员),并且它永远不应该让
isplay()
返回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
并不总是快速更新其状态,这可能导致
isplay()
返回意外值。不过,流媒体比本地播放更让人担心。

工作得很好,谢谢,应用程序在50页中有50个图像,每个图像单击播放不同的MP3,我是否需要在MainActivity上重复50次,或者有更好的编码方式,对不起,android新手,谢谢,我的意思是重复50次代码:if(mviewpage.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){MainActivity.this.mp=null;}}}}重复代码通常是一件坏事。如何解决此问题将取决于您是否有50个不同的媒体资源,或者50个图像具有相同的资源。如果您有50个不同的媒体资源,可以使用switch语句将局部变量设置为资源ID。然后在确定后使用
MediaPlayer
逻辑要使用的资源。如果50幅图像的资源相同,只需将If语句更改为检查值的范围,而不是等效为零。请检查我的第二个问题,我试图解决它,但我无法解决,请提供任何帮助,谢谢