在android中一个接一个地播放声音文件

时间:2013-08-07 18:18:55

标签: android

我试图在“res / raw”文件夹中播放android中的声音。但它只播放声音阵列中的第一个声音。还有其他办法吗?

原始文件夹中有三个声音文件

  

1.aa.ogg   2.ma.ogg   3.ar.ogg

package com.protonray.calculatorplus;    
import java.util.List;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;    
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;


    public class LayoutNew extends Activity{
        int count=0;
        int[] sounds={R.raw.aa,R.raw.ma,R.raw.ar };
        MediaPlayer mp=new MediaPlayer();

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layout_new);        
            Button play=(Button) findViewById(R.id.play);       
            play.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    count =0 ;
            //Play the Frist sound
                    mp =MediaPlayer.create(LayoutNew.this,sounds[count]);               
                    mp.start();
                    count =1 ;          
                }
            });





mp.setOnCompletionListener(new OnCompletionListener() {         
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        if(count<3){                    
                            mp.stop();
//Play next sound                   
                            mp =MediaPlayer.create(LayoutNew.this,sounds[count]);
                            mp.start();
                            count++;
                        }
                    }
                });
            }

        }

2 个答案:

答案 0 :(得分:1)

看看setNextMediaPlayer。这应该可以满足您的需求。

只需在onClick中创建3个媒体播放器(每个声音文件一个),然后将前两个文件的下一个播放器设置为下一个文件的播放器,例如:

play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
       for ( int snd = 0; snd < 3; snd++ )  {
          mp[snd] = MediaPlayer.create( LayoutNew.this, sounds[snd] );               
       }
       for ( int snd = 0; snd < 2; snd++ )  {
          mp[snd].setNextMediaPlayer( mp[snd+1] );
       }           
    );

您还应该在完成后释放所有3个媒体播放器(通过在每个媒体播放器上调用release())。这可以通过向最后媒体播放器(即onCompletion)添加mp[2]处理程序来轻松完成,以便它执行一次清理所有3个声音都已完成播放。


编辑,因为您需要API 8,您可以使用当前执行的方法,但是您必须为第一个和第二个声音设置OnCompletionListener,目前它只会在第一个和第二个声音结束时触发而不是第二个。试试这段代码:

MediaPlayer mp;

play.setOnClickListener( new View.OnClickListener() {

   @Override
   public void onClick(View arg0) {
      mp = MediaPlayer.create( LayoutNew.this, sounds[0] );
      mp.start();
      mp.setOnCompletionListener( new OnCompletionListener() {
         @Override
         public void onCompletion(MediaPlayer mp) {
            mp.dispose();
            mp = MediaPlayer.create( LayoutNew.this, sounds[1] );
            mp.start();
            mp.setOnCompletionListener( new OnCompletionListener() {
               @Override
               public void onCompletion(MediaPlayer mp) {
                  mp.dispose();
                  mp = MediaPlayer.create( LayoutNew.this, sounds[2] );
                  mp.start();
                  mp.setOnCompletionListener( new OnCompletionListener() {
                     public void onCompletion(MediaPlayer mp) {
                        mp.dispose();
                        mp = null;
                     }
                  });
               }
            });
         }
      });
   }
}

我没有测试这段代码,但它应该可行。要避免这种情况的关键是每次创建新的MediaPlayer时都需要调用setOnCompletionListener,以便新实例在完成时通知您。

另外,因为你要在onClick(一次性)中设置所有内容,所以除非你真的想要或者有其他充分的理由,否则你不需要使用计数器。无论哪种方式,这应该充分说明你做错了什么,以及如何做到这一点。

答案 1 :(得分:0)

只需根据您的代码判断,请尝试将mp.setOnCompletionListener放在onClick内。此外,我认为您不需要mp.stop