MediaPlayerでオーディオを5ミリ秒再生した後、recordメソッドを呼び出す方法。私はそのようなことを試しましたが、私にはわかりません、そしてこれを終わらせるための良い例は見つかりませんでした。
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ミリ秒は非常に短い期間であり、オーディオ出力をそのような期間に制限することはできません。 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
を使用して同等性をチェックしていることに注意してください。
スレッドをスリープ状態にすると、指定した期間中は何も実行されなくなります。これがUIスレッドの場合、その期間UIを効果的に「凍結」するため、適切に使用していることを確認してください。ただし、for
ループの例は、これがまさに、実行しようとしていることを示しています。
Thread.sleep(5)を使用するか、UIスレッドを使用しない場合は、タイマー、またはdoInBackground()メソッドで5ミリ秒待機した後にコールバックをトリガーするAsyncTaskを使用できます。
タイマーを使用するためのかなり良い例を次に示します。 https://stackoverflow.com/a/4598737/832008
ScheduledExecutorService を使用することもできます
ExecutorServiceを使用すると、コマンドをスケジュールして、特定の遅延後に実行するか、定期的に実行することができます。次の例は、ScheduledExecutorServiceを10秒ごとに1時間ビープするように設定するメソッドを持つクラスを示しています。
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 );