仅使用1个Media Player实例在同一按钮上播放和暂停Media Player? [英] Playing and Pausing Media Player on same button using only 1 Media Player instance?
问题描述
我的应用程序中有25个按钮,媒体播放器中有1个.我想要的是:第一次单击时播放声音.当我第二次单击以停止声音时 但是会发生什么:当我第一次单击时,它开始播放声音,当我再次单击时,它并没有停止它,而是从头开始再次播放它. 我的代码:
I have 25 buttons in my App and 1 Media Player. What I want: When I click first time to play sound. When I click second time to stop sound But what happens: When I click first time it start playing sound, when I click again, it doesn't stop it but instead it's playing it again from beginning. My code:
MediaPlayer mp;
if(mp!=null)
{
mp.release();
mp=null;
}
mp = MediaPlayer.create(MainActivity.this, R.raw.s5awesomeguitar);
mp.start();
如何设置我的代码以在第一次单击时播放媒体播放器,在第二次单击时停止播放声音.在同一按钮上 完整代码:
How can I set my code to play Media Player on 1st click , on 2nd click stop sound. On same button Full Code:
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position) {
case 0:
if(mp!=null)
{
mp.release();
mp=null;
}
else {
mp = MediaPlayer.create(Sadrzaj.this, R.raw.s3djclubmix);
mp.start();
}
break;
case 1:
if(mp!=null)
{
mp.release();
mp=null;
}
else {
mp = MediaPlayer.create(Sadrzaj.this, R.raw.s16dance);
mp.start();
}
break;
case 2:
if(mp!=null)
{
mp.release();
mp=null;
}
else {
mp = MediaPlayer.create(Sadrzaj.this, R.raw.s13ring);
mp.start();
}
break;
推荐答案
MediaPlayer is a state machine, here's the Doc .
因此,首先,请阅读文档,状态图显示:release()=> end.
So, first thing, read the doc, the state diagram says: release() => end.
因此,如果要使用不同的按钮控制同一音轨,请不要调用release();
并在各个案例之间设置集mp = null;
.
So if you want to control the same track with different buttons do not call release();
and do set set mp = null;
between your cases.
Dhaval为您提供了正确的解决方案:
Dhaval has given you the right solution:
if (mp.isPlaying()) {
mp.pause()
} else {
mp.play()
}
if (mp.isPlaying()) {
mp.pause()
} else {
mp.play()
}
此外,为了正确释放播放器,请先调用reset()然后再释放(),否则您将收到警告,提示播放器因未处理的事件而醒来."或类似的东西.
Also, in order to properly release the player, call first reset() then release() or you'll get a warning saying " the player went awaing with unhandled events.." or something like that.
请确保您了解状态图,并且它会像魅力一样起作用:)
Please make sure you understand the state diagram and it wiil work like a charm :)
总结:
-
阅读文档:)
Read the doc :)
检查播放器的播放状态
删除不必要的对release()的调用
Remove the unnecessary calls to release()
希望这会有所帮助!
好的,这就是我要做的:(它可能无法编译,我在这里只有一个文本编辑器,对不起^^)
Okay so here's what I'd do: (It might not compile, I only have a text editor here so sorry^^)
在您的活动中(我想): 您的活动必须实现onPreparedListener
In your activity(I suppose): Your activity must implement the onPreparedListener
@Override
onCreate() {
if(mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer()
mMediaPlayer.setOnPreparedListener(this); //registers your activity as the onPrepared Listener
}
...
}
//Called back when media is ready to be played
@Override
onPrepared() {
if(mMediaPlayer != null){
mMediaPlayer.start();
}
}
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position) {
case 0:
..
break;
case 1:
if(mMediaPlayer.isPlaying() {
mMediaPlayer.pause();
} else {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(Sadrzaj.this, R.raw.s16dance);
mMediaPlayer.prepareAsync();//call back onPrepared()
//mMediaPlayer.start(); sorry little mistake here no need to call start(); since it is called in onPrepared()
}
break;
default:
if(mMediaPlayer != null) {
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
break;
}
}
//Release the player and de listener
@Override
onDestroy() {
if(mMediaPlayer != null) {
mMediaPlayer.setOnPreparedListener(null);
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null
}
}
这篇关于仅使用1个Media Player实例在同一按钮上播放和暂停Media Player?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!