Вызов метода через 5 миллисекунд

Как вызвать метод записи после 5-ти миллисекундного воспроизведения аудио с MediaPlayer. Я пытался что-то подобное, но я не знаю, и я не нашел хороших примеров, чтобы положить этому конец.

while(mp.isPlaying()){
    if(record=0){
       for(int i=0; i<5millisec; i++){ //how to define 5 millisec or is any better solution
       }
    startRecord();
    record=1;
    }
}
mp.stop();
mp.release();
mp=null;   

6 ответов

Решение

5 миллисекунд - это очень короткий период времени, и вы не можете ограничить вывод звука такой длительностью. ты можешь использовать Handler выполнить отложенную функцию, но она не обеспечит выполнение через 5 миллисекунд после планирования. код для этого:

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
      public void run(){
        startRecord();
        mp.stop();
        mp.release();
   }
}, 5);

Вы можете использовать метод postDelayed. В приведенном ниже примере я запускаю свою процедуру через 100 миллисекунд после вызова метода.

new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        barVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
                    }
                }, 
                100);

Попробуй это:

//Auto Start after 2 seconds
        if(ENABLE_AUTO_START) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    // this code will be executed after 2 seconds
                    doThis();
                }
            }, 2000);
        }

Возможно, вы хотите использовать Thread.sleep?

Вот так:

if(record == 0){
   Thread.sleep(5);
}

Обратите внимание, что я использовал == в if оператор для проверки на равенство, а не присвоение значения 0 каждый раз, я предполагаю, что это то, что вы хотите.

Стоит отметить, что перевод Thread в спящий режим прекратит его выполнение в течение указанного вами периода времени. Если это поток пользовательского интерфейса, то вы фактически "заморозите" пользовательский интерфейс на этот период, поэтому убедитесь, что вы используете его соответствующим образом. Однако, вы пример for цикл указывает, что это именно то, что вы пытаетесь сделать.

Вы также можете использовать ScheduledExecutorService

Используя ExecutorService, вы можете запланировать выполнение команд после заданной задержки или периодическое выполнение. В следующем примере показан класс с методом, который настраивает ScheduledExecutorService для звукового сигнала каждые десять секунд в течение часа:

import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }
public static MediaRecorder mRecorder = new MediaRecorder();

public void startRecording(String fileName) {
    if(mRecorder != null) {
        try {
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setOutputFile(fileName);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            try {
                mRecorder.prepare();
            } catch (IOException e) {
                Log.e(StartPhoneCallService.class.getSimpleName(), "prepare() failed");
            }
            mRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}

public void stopRecording() {
    if(mRecorder != null) {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }
}

Теперь вы можете вызвать обработчик для воспроизведения 5 миллисекунд

private final int recording_time = 5;

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
  @Override
  public void run() {
     startRecording("YOUR FILE NAME");
     // Stop your recording after 5 milliseconds
     stopRecording();
   }
}, recording_time );

Вы можете попробовать использовать Thread.sleep(5) или, если вы не хотите использовать поток пользовательского интерфейса для этого, вы можете использовать Timer или AsyncTask, который вызывает обратный вызов после ожидания 5 мс в методе doInBackground().

Вот довольно хороший пример использования таймера: /questions/8848319/tajmer-android-kak/8848327#8848327

Другие вопросы по тегам