3

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

raw文件夹中有三个声音文件

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++;
                        }
                    }
                });
            }

        }
4

2 回答 2

2

看看setNextMediaPlayer。那应该可以完成您所需要的。

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

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()它们中的每一个)。这可以通过仅向LAST媒体播放器(即)添加onCompletion处理程序来轻松完成,以便在所有 3 种声音播放完毕后进行清理。mp[2]


编辑,因为您需要 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;
                     }
                  });
               }
            });
         }
      });
   }
}

我没有测试这段代码,但它应该可以工作。关键是你需要在setOnCompletionListener每次创建新的 MediaPlayer 时调用,以便新实例在完成时通知你。

此外,因为您正在(一次)设置所有内容,所以您onClick不需要使用计数器,除非您真的想要,或者有其他充分的理由。无论哪种方式,这都应该充分说明您做错了什么以及如何做才能使其正常工作。

于 2013-08-09T12:07:45.900 回答
0

仅根据您的代码判断,尝试将您mp.setOnCompletionListeneronClick. 另外我认为你不需要mp.stop

于 2013-08-07T18:39:19.087 回答