为什么我的第三首歌没有播放,我怎样才能让它播放?
why is my third song not playing and how can I make it play?
我目前正在播放一首歌曲,第一首歌曲结束后,第二首歌曲开始播放。当我的第二首歌曲结束时,第三首歌曲应该开始播放,但实际上没有。我如何使用 MediaPlayer 执行此操作。
这是我的 onCompletion 代码:
@Override
public void onCompletion(MediaPlayer mp) {
didFinishFirst = true;
if(didFinishFirst) {
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishSecond = true;
} else if(didFinishSecond){
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.three);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishThird = true;
}
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// No need
}
});
}
我在这里所做的是在与 UI 线程分开的线程中启动一个 MediaPlayer(回想起来,我应该 运行 我的 startMusic() 代码在异步任务中,但我当我还是一个新手程序员时写回了这个)
然后我为每首歌曲的结尾设置了一个监听器,一旦第一首歌曲根据监听器结束,我就开始播放下一首歌曲,依此类推。
希望对您有所帮助!
public static void startMusic(final Context context){
handlerMusic = new Handler();
handlerMusic.post(new Runnable() {
@Override
public void run() {
trackList.add(R.raw.diaz_choir);
trackList.add(R.raw.diaz_strum_in_mouth);
trackList.add(R.raw.diaz_underwater);
trackList.add(R.raw.diaz_trap);
for (int s = 0; s < trackList.size(); s++){
newList.add(trackList.get(s));
}
mMediaPlayer =
MediaPlayer.create(context,newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
/*
mp = MediaPlayer.create(context, newList.size() - 1);
mp.reset();
//mp.prepare();
mp.start();
*/
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
}
});
}
});
}
});
}
});
}
您需要 link 通过 MediaPLayer.create
将完成侦听器再次发送到新的媒体播放器实例 return。只有这样 oncompletion
才会被触发
Override
public void onCompletion(MediaPlayer mp) {
didFinishFirst = true;
if(didFinishFirst) {
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishSecond = true;
mp.setOnCompletionListener(this);
// ^^^^^^^^^^^^^^^^^^^^^^
} else if(didFinishSecond){
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.three);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishThird = true;
mp.setOnCompletionListener(this);
// ^^^^^^^^^^^^^^^^^^^^^^
}
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// No need
}
});
}
我目前正在播放一首歌曲,第一首歌曲结束后,第二首歌曲开始播放。当我的第二首歌曲结束时,第三首歌曲应该开始播放,但实际上没有。我如何使用 MediaPlayer 执行此操作。
这是我的 onCompletion 代码:
@Override
public void onCompletion(MediaPlayer mp) {
didFinishFirst = true;
if(didFinishFirst) {
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishSecond = true;
} else if(didFinishSecond){
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.three);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishThird = true;
}
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// No need
}
});
}
我在这里所做的是在与 UI 线程分开的线程中启动一个 MediaPlayer(回想起来,我应该 运行 我的 startMusic() 代码在异步任务中,但我当我还是一个新手程序员时写回了这个) 然后我为每首歌曲的结尾设置了一个监听器,一旦第一首歌曲根据监听器结束,我就开始播放下一首歌曲,依此类推。
希望对您有所帮助!
public static void startMusic(final Context context){
handlerMusic = new Handler();
handlerMusic.post(new Runnable() {
@Override
public void run() {
trackList.add(R.raw.diaz_choir);
trackList.add(R.raw.diaz_strum_in_mouth);
trackList.add(R.raw.diaz_underwater);
trackList.add(R.raw.diaz_trap);
for (int s = 0; s < trackList.size(); s++){
newList.add(trackList.get(s));
}
mMediaPlayer =
MediaPlayer.create(context,newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
/*
mp = MediaPlayer.create(context, newList.size() - 1);
mp.reset();
//mp.prepare();
mp.start();
*/
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
songNum++;
mMediaPlayer =
MediaPlayer.create(
context, newList.get(songNum));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.start();
}
});
}
});
}
});
}
});
}
您需要 link 通过 MediaPLayer.create
将完成侦听器再次发送到新的媒体播放器实例 return。只有这样 oncompletion
才会被触发
Override
public void onCompletion(MediaPlayer mp) {
didFinishFirst = true;
if(didFinishFirst) {
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishSecond = true;
mp.setOnCompletionListener(this);
// ^^^^^^^^^^^^^^^^^^^^^^
} else if(didFinishSecond){
Uri songUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.three);
mp = MediaPlayer.create(getApplicationContext(), songUri);
mp.start();
mState = STATE_INITIALIZED;
didFinishThird = true;
mp.setOnCompletionListener(this);
// ^^^^^^^^^^^^^^^^^^^^^^
}
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// No need
}
});
}