我目前正在尝试创建一个for循环,在该循环中它将播放原始文件,完成后将继续播放数组中的下一个声音文件。当前正在一次播放所有文件。关于如何解决此问题的任何建议?我认为完成监听器可能存在问题,但不确定。谢谢。
我的代码:
package com.example.mediatest;
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
MediaPlayer mp = new MediaPlayer();
for (int y =0; y<3; y++){
mp = MediaPlayer.create(this, myMusic[y]);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
}
});
}
您可以创建单独的MediaPlayer对象,首先启动,然后在onCompletion
中启动下一个。对于可扩展的解决方案,请尝试以下方法:
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mCompleted = 0;
MediaPlayer mp = MediaPlayer.create(this, myMusic[0]);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mCompleted++;
mp.reset();
if (mCompleted < myMusic.length()) {
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(myMusic[mCompleted]);
if (afd != null) {
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
}
} catch (Exception ex) {
// report a crash
}
} else {
// done with media player
mp.release();
mp = null;
}
}
});
mp.start();
一种更简单的方法(稍微浪费资源)是:
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mNext;
OnCompletionListener mListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
startNextFile();
}
};
@Override
public void onCreate() {
// usual onCreate stuff here, then...
// either here or whenever you want to start the sequence
mNext = 0;
startNextFile();
}
void startNextFile() {
if (mNext < myMusic.length) {
MediaPlayer mp = MediaPlayer.create(this, myMusic[mNext++]);
mp.setOnCompletionListener(mListener);
mp.start();
}
}
这是在继续循环中播放歌曲的有效代码。
public class MainActivity extends Activity
{
private int[] tracks = {R.raw.explosion,R.raw.pianothingy_one,R.raw.car_horn_x};
int mCompleted = 0;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MediaPlayer mp = MediaPlayer.create(this, tracks[0]);
mp.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mCompleted++;
mp.reset();
if (mCompleted < tracks.length)
{
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
if (afd != null)
{
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
mp.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else if (mCompleted>=tracks.length)
{
mCompleted =0;
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
if (afd != null)
{
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
mp.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else
{
mCompleted=0;
mp.release();
mp = null;
}
}
});
mp.start();
鉴于您只有3个,因此创建一个MediaPlayers数组会更容易。您应该只启动第一个播放器,并设置onCompletionListeners,然后在该播放器中启动下一个播放器。希望这会有所帮助。
int flag=0;
int track;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
NextSongOnline()
}
public void NextSongOnLine(){
if (flag == 0){
track = position;
}
flag = 1;
if (track == position){
position = ((position + 1)%mySongs.size());
Uri uri3 = Uri.parse(mySongs.get(position).toString());
myMediaPlayer = MediaPlayer.create(getApplicationContext(),uri3);
sname = mySongs.get(position).getName().toString();
songTitle.setText(sname);
myMediaPlayer.start();
seekBar.setMax(myMediaPlayer.getDuration()/1000);
//set End time of music
endTimeText.setText(createTimerLabel(myMediaPlayer.getDuration()/1000));
}
track++;
myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
NextSongOnLine();
Toast.makeText(getApplicationContext(),"Auto Playing Next Song",Toast.LENGTH_SHORT).show();
}
});
}
}