Comment appeler la méthode d'enregistrement après 5 millisecondes de lecture audio avec MediaPlayer. J'ai essayé quelque chose comme ça mais je ne le sais pas et je n'ai trouvé aucun bon exemple pour y mettre fin.
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;
5 millisecondes est une période très courte et vous ne pouvez pas limiter la sortie audio à une telle durée . Vous pouvez utiliser Handler
pour exécuter une fonction retardée mais cela ne garantira pas l'exécution à 5 millisecondes après la planification .. faire ça:
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
startRecord();
mp.stop();
mp.release();
}
}, 5);
Vous pouvez utiliser la méthode postDelayed. Dans l'exemple ci-dessous, j'exécute ma routine 100 millions après pour appeler la méthode.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
barVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
}
},
100);
essaye ça:
//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);
}
Peut-être que vous voulez utiliser Thread.sleep ?
Ainsi:
if(record == 0){
Thread.sleep(5);
}
Notez que j’ai utilisé ==
dans l’instruction if
pour vérifier l’égalité, plutôt que d’attribuer la valeur de 0
à chaque fois, je suppose que c’est ce que vous voulez.
Il est à noter que la mise en veille d'un thread l'empêchera de faire quoi que ce soit pendant la durée spécifiée. S'il s'agit d'un thread d'interface utilisateur, vous "gèlerez" efficacement l'interface utilisateur pour cette durée. Assurez-vous de l'utiliser correctement. Cependant, votre exemple de boucle for
indique que c’est exactement le genre de chose que vous essayez de faire.
Vous pouvez essayer d'utiliser Thread.sleep (5) ou, si vous ne souhaitez pas utiliser le fil d'interface utilisateur pour cela, vous pouvez utiliser un minuteur ou une AsyncTask qui déclenche un rappel après avoir attendu 5 ms dans la méthode doInBackground ().
Voici un très bon exemple d'utilisation de Timer: https://stackoverflow.com/a/4598737/832008
Vous pouvez également utiliser ScheduledExecutorService
À l'aide d'un ExecutorService, vous pouvez planifier l'exécution de commandes après un délai donné ou une exécution périodique. L'exemple suivant montre une classe avec une méthode qui configure un ScheduledExecutorService pour qu'il émette un bip toutes les dix secondes pendant une heure:
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);
}
}