Вызов метода через 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;   

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

попробуйте следующее:

//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);
        }

Ответ 4

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

Так же:

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

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

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

Ответ 5

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

Вот довольно хороший пример использования таймера: fooobar.com/questions/27827/...

Ответ 6

Вы также можете использовать 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);
   }
 }

Ответ 7

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;

startRecording("YOUR FILE NAME");

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