私は私のレイアウトで2つのボタンがあります。1.再生/一時停止2停止再生と一時停止ボタンは、素晴らしい作品が、停止ボタンは仕事をしないとき。問題が始まるところ私は実際にはわかりません。
ここに私のコードです
case R.id.playBtn:
if (mediaPlaying){
mediaPlaying = false;
mPlayer.pause();
playedLength = mPlayer.getCurrentPosition();
playButton.setBackgroundResource(R.drawable.play);
}else{
mediaPlaying = true;
if(mPlayer == null){
// create the media player
mPlayer = new MediaPlayer();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mediaPlaying = false;
playedLength = 0;
playButton.setBackgroundResource(R.drawable.play);
}
});
try {
afd = getAssets().openFd(""+AUDIO+"");
mPlayer.setDataSource(afd.getFileDescriptor());
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
} else
// resume playing
mPlayer.seekTo(playedLength);
mPlayer.start();
playButton.setBackgroundResource(R.drawable.pause);
}
break;
case R.id.stopBtn:
if (mediaPlaying){
mediaPlaying = false;
if (mPlayer != null){
mPlayer.stop();
mPlayer = null;
playButton.setBackgroundResource(R.drawable.play);
}
}else{
mediaPlaying = true;
Toast.makeText(getApplicationContext(), "Added to favorites.", Toast.LENGTH_SHORT).show();
if (mPlayer != null){
mPlayer.pause();
mPlayer.seekTo(0);
}
}
break;
私はそれが再生または一時停止しているかどうか、停止ボタンを完全に停止プレイヤーをクリックすると、これを行うにしたいです。私は、停止をクリックした場合には再生中、一時停止、停止をクリックしたとき、プレイヤーの再起動は、それは再起動しません。すべてのヘルプは大歓迎です。
更新
case R.id.playBtn:
if (state == PlayerState.PLAYING){
mPlayer.pause();
playedLength = mPlayer.getCurrentPosition();
playButton.setBackgroundResource(R.drawable.play);
}else if (state == PlayerState.PLAYING){
if(mPlayer == null){
// create the media player
mPlayer = new MediaPlayer();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mediaPlaying = false;
playedLength = 0;
playButton.setBackgroundResource(R.drawable.play);
}
});
try {
afd = getAssets().openFd(""+AUDIO+"");
mPlayer.setDataSource(afd.getFileDescriptor());
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
} else
// resume playing
mPlayer.seekTo(playedLength);
mPlayer.start();
playButton.setBackgroundResource(R.drawable.pause);
}
break;
case R.id.stopBtn:
if (state == PlayerState.STOPPED){
if (mPlayer != null){
mPlayer.stop();
mPlayer = null;
playButton.setBackgroundResource(R.drawable.play);
}
}else if (state == PlayerState.PAUSED){
Toast.makeText(getApplicationContext(), "Added to favorites.", Toast.LENGTH_SHORT).show();
if (mPlayer != null){
mPlayer.pause();
mPlayer.seekTo(0);
}
}
break;
ブール値は、その場合は、別の動作が発生した理由mediaPlaying
、停止ボタンがクリックされたときに異なる値を持つことになります。それだけでプレイヤーは値がtrueである停止し、プレーヤーが一時停止しているときにストップをヒットした場合、それは次のようになりますfalse
あなたがコードプレーヤーを停止しないようにします。
私はあなたの代わりに、ブール値を使用しての(停止、再生中停止を)などのためPlayerState列挙型を追加することを示唆しています。あなたはプレイヤーが内にあり、どのような行動を取るの状態かを知ることは、その後容易になります。
コード内で
public enum PlayerState {
PLAYING,
STOPPED,
PAUSED
}
その後、変数を作成し、初期状態を設定(あなたがmediaPlayingのために行うのと同じ(とでは、同じ場所で、あなたのアプリケーション))
private PlayerState state = PlayerState.STOPPED;
その後、あなたの中にあなたがmediaPlayingを操作している場合(mediaPlaying)の交換場所を置き換えるコードでif文のような
if (state == PlayerState.PLAYING) { ...
これが完了すると、あなたは、もはやブールmediaPlayingを必要としません。そして、あなたは、あなたのアプリケーションでメディアプレーヤーの状態のより良い内容の知識を持っています。
ハード状態コードのいくつかの種類は、私はすべてのコードを持っていないので。それぞれのケースで(あなたのコードに欠けている)状態を状態遷移をチェックし、設定
case R.id.playBtn:
if (state == PlayerState.PLAYING){
// logic here for going from playing to paused
state = PlayerState.PAUSED;
} else if (state != PlayerState.PLAYING){
// logic from non playing to playing
state = PlayerState.PLAYING;
}
break;
case R.id.stopBtn:
if (state == PlayerState.PLAYING){
// logic if playing
} else if (state == PlayerState.PAUSED){
// logic if paused
}
state = PlayerState.STOPPED;
break;