2011-06-15 47 views
1

我目前正在尝试创建一个for循环,它将播放一个原始文件,当它完成时,它将继续到数组中的下一个声音文件。它目前正在播放所有文件。任何关于如何解决这个问题的建议?我认为完成监听器可能存在问题,但不确定。谢谢。for循环使用原始音乐数组android

我的代码:

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 

     } 

     }); 
    } 

回答

5

您可以创建单独的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(); 
    } 
} 
+0

我试着你的建议,得到一个错误MediaPlayer mp = new MediaPlayer(this,myMusic [0]);'带有“构造函数MediaPlayer(mediatest,int)是未定义的。”我工作过但仍然没有成功。我做错了什么? – Splitusa 2011-06-15 18:36:20

+0

对不起。应该是'MediaPlayer mp = MediaPlayer.create(this,myMusic [0]);'我会修复代码 – 2011-06-15 19:15:18

+0

Im有点困惑于你所建议的代码的顺序,因为我得到错误“can not解决变量“ nd是否意味着'public void startNextFile(){'? – Splitusa 2011-06-16 02:39:20

0

会更容易创建MediaPlayers数组,因为你只有3人。您应该只启动第一个并设置onCompletionListeners,您将在其中启动下一个玩家。希望这可以帮助。

+0

这是一个好主意。我现在就开始工作,让你知道它是如何工作的 – Splitusa 2011-06-15 18:37:12

+0

这就是我想出来的'MediaPlayer mp1 = MediaPlayer.create(this,myMusic [0]); MediaPlayer mp2 = MediaPlayer.create(this,myMusic [1] ); MediaPlayer mp3 = MediaPlayer.create(this,myMusic [2]); final MediaPlayer [] mediaMp = {mp1,mp2,mp3}; mediaMp [0] .start(); mediaMp [0] .setOnCompletionListener(new OnCompletionListener(){@ Override public void onCompletion(MediaPlayer mp){mediaMp [1] .start(); mediaMp [1] .setOnCompletionListener(new OnCompletionListener(){public void onCompletion(MediaPlayer mp){ mediaMp [2] .start();}'的事情是,它的工作原理,但必须有一个更短的方式 – Splitusa 2011-06-15 18:59:46

0

这是在播放歌曲的工作代码继续循环。

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();