2014-07-15 37 views
0

此代碼在初始循環中正常工作。但是,一旦我停下來再次敲擊循環按鈕,文件就會混亂起來,並且按順序播放。任何人都有線索是什麼錯誤?任何幫助,將不勝感激。在Android的循環聲音文件?

public class OneExp extends ActionBarActivity { 

private ListView lv; 
private ArrayAdapter<String> arrayAdapter; 
private MediaPlayer mp; 
private MediaPlayer mp2; 
int[] myAudio = {R.raw.e_1101, R.raw.e_1102, R.raw.e_1103, R.raw.e_1104, R.raw.e_1105, 
     R.raw.e_1106, R.raw.e_1107, R.raw.e_1108, R.raw.e_1109, R.raw.e_1110, R.raw.e_1111}; 
int mCompleted = 0; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.one_exp); 

    Button btnLoop = (Button) findViewById(R.id.button1); 
    Button btnStop = (Button) findViewById(R.id.button2); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if (mp2 != null) { 

       if (mp2.isPlaying()) { 
        mp2.stop(); 

       } 
       mp2.reset(); 
       mp2.release(); 
       mp2 = null; 
      } 
      } 
    }); 

    btnLoop.setOnClickListener(new OnClickListener() { 



     @Override 
     public void onClick(View arg0) { 

      mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]); 
      mp2.setOnCompletionListener(new OnCompletionListener() 
      { 
       @Override 
       public void onCompletion(MediaPlayer mp2) 
       { 
        mCompleted++; 
        mp2.reset(); 
        if (mCompleted < myAudio.length) 
        { 
         try 
         { 
          AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]); 
          if (afd != null) 
          { 
           mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
           afd.close(); 
           mp2.prepare(); 
           mp2.start(); 
          } 
         } 
         catch (Exception ex) 
         { 
          ex.printStackTrace(); 
         } 

        } 
        else if (mCompleted>=myAudio.length) 
        { 
         mCompleted =0; 
         try 
         { 
          AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]); 
          if (afd != null) 
          { 
           mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
           afd.close(); 
           mp2.prepare(); 
           mp2.start(); 
          } 
         } 
         catch (Exception ex) 
         { 
          ex.printStackTrace(); 
         } 
        } 
        else 
        { 
         mCompleted=0; 
         mp2.release(); 
         mp2 = null; 
        } 

       } 
      }); 


      mp2.start(); 

     } 

    }); 

回答

0

看一看http://developer.android.com/reference/android/media/MediaPlayer.html#setLooping(boolean

你爲什麼要使用這麼多的代碼時,你可以輕鬆地使用的start(),停止(),暫停()和setLooping(真)呢?

據我所見,沒有必要檢查音頻的長度。

當您在稍後的start()中調用pause()時,您的音頻將繼續在原來的位置。

只有當您完全使用該文件時才能呼叫釋放/重置。

+0

我想循環一系列文件,而不僅僅是一個。你如何設置一個例如連續三個文件的循環,並重復所有三個,直到我推停止? – user3623689

+0

我會做一個正常的FOR()循環。如果只有3個文件,它們會在同一時間停止,而不會有任何明顯的延遲。 – Riverside