2017-12-27 77 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

이벤트는 한 번만 시작됩니다. 하나씩 노래를 재생하려면 루프를 만들거나 재귀 적으로 재생해야합니다. 여기에 song0.setOnCompletionListenerloadsong() 안에 사용하고 반복적으로 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 함수를 호출합니다. 이 방법을 좀 더 자세히 사용하려면 샘플 코드도 만들 수 있습니다.

도움이되기를 바랍니다.