如何播放一定次数的声音?

时间:2012-06-16 13:20:55

标签: android loops android-mediaplayer

我正在开发一个应用程序来执行以下操作:

当您按下按钮时,应用程序会播放持续两秒五次的声音。在第五次播放声音后,应用程序会休眠30秒。睡觉后,循环再重复两次。

我的问题是我第五次播放后无法停止声音。我想我需要使用for循环或while循环,但我无法正确编程。

循环:

for(i=0; i==5; ) {
    sound.start(); 
    if(sound.isPlaying()) {
        if(false) { 
            sound.stop(); 
            i++; 
        } 
    }
}

sound.stop();
好吧,现在我构建了这段代码,但他唯一的错是'for'不能正常工作......他不会重复他内部的代码两次。 有人可以告诉我为什么?

              for( counter=0; counter<2; ++counter){

                new CountDownTimer(20000, 2000) {       
                    public void onTick(long millisUntilFinished) {
                    //call to my UI thread every 2 seconds  
                     sound.start();    
                   }

                   public void onFinish() {          
                   //final call to my UI thread after 10 seconds

                       chrono2.setBase(SystemClock.elapsedRealtime());
                       chrono2.start();

                       chrono2.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

                           public void onChronometerTick(Chronometer chronometer) {
                               // TODO Auto-generated method stub
                               long elapsedTime = SystemClock.elapsedRealtime()-chronometer.getBase();
                               Log.i(this.getClass().getName(), "" + elapsedTime);

                               if (elapsedTime > 10000){
                                   chrono2.stop();
                                   chrono2.setBase(SystemClock.elapsedRealtime());
                                   Toast.makeText(getApplicationContext(), "" , Toast.LENGTH_SHORT).show();
                               }
                           }
                       });

                    } // end onFinish   
                }.start(); // end count down
            }

4 个答案:

答案 0 :(得分:2)

for(i=0; i==5; ) {
    sound.start(); 
    if(sound.isPlaying()) {
        if(false) { 
            sound.stop(); 
            i++; 
        } 
    }
}    
sound.stop();

for循环标题的第二部分是必须保持要输入的正文的条件。 i=0i == 5不匹配,因此条件从一开始就是错误的,从未进入过。

你想要进修

 for(i=0; i!=5; ) {

 for(i=0; i<5; ) {

代替。

i在哪里递增或以其他方式改变了?在一个总是错误的块中,换句话说:永远不会。

也许你想表达一下,如果前面的陈述是假的,那么......

你这样做是通过否定陈述来实现的:

    if (! sound.isPlaying ()) { 
            sound.stop(); 
            i++; 
    }

在不知道声音播放是否阻塞的情况下,很难知道如何控制声音。

让我们阅读要求并从头开​​始:

  

当您按下按钮时,应用程序会播放持续两声的声音   秒,五次。在第五次播放声音后   应用程序睡眠30秒。睡觉后,周期就是   再重复两次。

你有3次外循环,内循环5次。

for (int i=0; i < 3; ++i) {
    for (int j=0; j < 5; ++j) {
        sound.start(); 
        sleep (2); // seconds of sound
    } 
    sleep (30); // seconds of silence
}    

答案 1 :(得分:0)

只需保留一个计数器变量,该变量将告诉应用程序在while循环中达到5时进入睡眠状态。伪代码是这样的:

final int REPEAT_RATE = 5;
int counter = 0;
while(counter < 3 * REPEAT_RATE)
{
    if(counter == REPEAT_RATE) 
    {
        //Sleep for thirty seconds
    }
    //Here Play the sound for 2 seconds
}

答案 2 :(得分:0)

这很简单,只需使用倒计时器:

new CountDownTimer(10000, 2000) {       
    public void onTick(long millisUntilFinished) {          
    //call to my UI thread every 2 seconds  
     playSound();    
   }       
   public void onFinish() {          
   //final call to my UI thread after 10 seconds     
    }   
}.start();

使用简单的计时器睡30秒:

new Handler().postDelayed(new Runnable() {         
  @Override         
  public void run() {             
   //do after 30 seconds              
  }     
 }, 30000);

通过调整和组合这两个,你可以发挥作用......

编辑:解决方案(未经测试)

int repeatAlarm = 3; //above onCreate
....

playSoundFiveTimes(); //in onCreate


.......

private void playSoundFiveTimes(){

 new CountDownTimer(10000, 2000) {       
    public void onTick(long millisUntilFinished) {          
     sound.stop();
     sound.start();        
    }       
   public void onFinish() {          
      repeatAlarm--;
      if(repeatAlarm > 0) wait30seconds(); 
    }   
 }.start();
}


 private void wait30seconds(){

  new Handler().postDelayed(new Runnable() {         
      @Override         
      public void run() {             
       playSoundFiveTimes();            
      }     
     }, 30000);
 }

答案 3 :(得分:0)

这是我的解决方案:
你可以使用seekTo(0)函数 然后mp再次开始!

private void startCountDownTimer() {
    cdTimer = new CountDownTimer(total, 1000) {
        public void onTick(long l) {

            mp.seekTo(0);
            mp.start();
}


        public void onFinish() {
            mp.stop();
            MediaPlayer doneMp = MediaPlayer.create(getApplicationContext(), R.raw.finished_challenge);
            doneMp.start();


        }
    }.start();
}