在Android的循环声音文件?

问题描述:

此代码在初始循环中正常工作。但是,一旦我停下来再次敲击循环按钮,文件就会混乱起来,并且按顺序播放。任何人都有线索是什么错误?任何帮助,将不胜感激。在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(); 

     } 

    }); 

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

你为什么要使用这么多的代码时,你可以轻松地使用的start(),停止(),暂停()和setLooping(真)呢?

据我所见,没有必要检查音频的长度。

当您在稍后的start()中调用pause()时,您的音频将继续在原来的位置。

只有当您完全使用该文件时才能呼叫释放/重置。

+0

我想循环一系列文件,而不仅仅是一个。你如何设置一个例如连续三个文件的循环,并重复所有三个,直到我推停止? – user3623689

+0

我会做一个正常的FOR()循环。如果只有3个文件,它们会在同一时间停止,而不会有任何明显的延迟。 – Riverside