2017-12-27 7 views
1

setOnCompletionListenerは初めて曲の完了を検出しています。以下のコードでは、song1song2が順番に再生されますが、残りの曲は再生されません。setOnCompletionListenerは初めての完了を検出しています

私は曲を一つずつ再生して、曲の間に静寂を加えたいと思っています。

MediaPlayer song0=new MediaPlayer(); 
    int track = 0; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    song0=MediaPlayer.create(this,R.raw.song1); 
play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       function(); 
      } 
     }); 

     song0.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer song0) { 
       track++; 
       loadsong(); 

       function(); 
      } 

     }); 
    } 
    void loadsong() 
    { 

     if(track==1)  song0=MediaPlayer.create(this,R.raw.song2); 
     if(track==2)  song0=MediaPlayer.create(this,R.raw.song3); 
     if(track==3)  song0=MediaPlayer.create(this,R.raw.song4); 
    }**strong text** 


    void function(){ 
     if(track<4) song0.start(); 
     else 
      song0.stop(); 

    } 

答えて

0

イベントは1回限り開始します。あなたが曲を1つずつ演奏したい場合は、ループを作成するか再帰的に行う必要があります。ここでは、をloadsong()の内部で使用し、毎回loadsong()と呼び出された場合のスニペットを示します。 loadsong()メソッドを少し変更しました。ここでは、コードは次のとおり

public class MainActivity extends AppCompatActivity { 
private Button play; 
MediaPlayer song0 = new MediaPlayer(); 
int track = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    play = findViewById(R.id.play); 

    play.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      loadsong(); 
     } 
    }); 


} 


void loadsong() { 
    track++; 
    if (track == 1) { 
     song0 = MediaPlayer.create(this, R.raw.track1); 
     song0.start(); 
    }else if (track == 2) { 
     song0 = MediaPlayer.create(this, R.raw.track2); 
     song0.start(); 
    }else if (track == 3) { 
     song0 = MediaPlayer.create(this, R.raw.track3); 
     song0.start(); 
    }else if (track > 3) { 
     song0.stop(); 
    } 

    song0.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer song) { 
      song.stop(); 
      loadsong(); 
     } 
    }); 

} 

}

1

問題は、曲を再生する必要があるたびにMediaPlayerオブジェクトを作成することです。したがって、別の曲のMediaPlayerオブジェクトを作成した後で、毎回OnCompletionListenerを設定する必要があります。

コード内のいくつかの行を変更して問題を解決できます。実装する

MediaPlayer song0=new MediaPlayer(); 
int track = 0; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    song0=MediaPlayer.create(this,R.raw.song1); 
    play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       function(); 
      } 
     }); 

     song0.setOnCompletionListener(m_CompletionListener); 
    } 
    void loadsong() 
    { 

     if(track==1) { 
     song0=MediaPlayer.create(this,R.raw.song2); 
     song0.setOnCompletionListener(m_CompletionListener); 
    } 
     if(track==2) { 
     song0=MediaPlayer.create(this,R.raw.song3); 
     song0.setOnCompletionListener(m_CompletionListener); 
    } 

     if(track==3) { 
     song0=MediaPlayer.create(this,R.raw.song4); 
     song0.setOnCompletionListener(m_CompletionListener); 
    } 

    }**strong text** 


    void function(){ 
     if(track<4) song0.start(); 
     else 
      song0.stop(); 

    } 
    MediaPlayer.OnCompletionListener m_CompletionListener = new MediaPlayer.OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer song0) { 
       track++; 
       loadsong(); 
       function(); 
      } 

     }; 

もう一つの方法は、唯一のMediaPlayerのオブジェクトを作成し、代わりにMediaPlayerのオブジェクト毎回作成するのではなく、他の曲を再生するためsetDataSource関数を呼び出すことです。 この方法をさらに詳しく知りたい場合は、サンプルコードも作成できます。

私はそれがあなたを助けてくれることを願っています!

関連する問題