媒体播放器在完成后第一次点击时不会重新启动
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 出现意外值。不过,与本地播放相比,流媒体更值得关注。
使用 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 出现意外值。不过,与本地播放相比,流媒体更值得关注。