3

「res/raw」フォルダーから次々とアンドロイドでサウンドを再生しようとしています。ただし、サウンド配列から最初のサウンドを再生しているだけです。それを行う他の方法はありますか?

raw フォルダには 3 つのサウンド ファイルがあります

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 つのメディア プレーヤー (サウンド ファイルごとに 1 つ) をonClick作成し、最初の 2 つのファイルの次のプレーヤーを次のファイルのプレーヤーに設定するだけです。次に例を示します。

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、最初と 2 番目のサウンドの両方に を設定する必要があります。現在、2 番目のサウンドではなく、最初のサウンドが終了したときにのみトリガーされます。このコードを試してください:

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 に答える