Questo è il mio primo post.
Sto tentando di sviluppare una app android, attraverso Android Studio in linguaggio Java, per realizzare un metronomo.
Il problema che non riesco a risolvere è il seguente: Il primo beep è irregolare rispetto a quelli successivi, che invece si susseguono in modo regolare. Nel simulatore di android studio il problema non si presenta, mentre nello smartphone fisico (note 10 e s22) i primi due beep sono irregolari. Questo è il codice che ho utilizzato:
package com.example.mymetronomo;
import android.app.Activity;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends Activity {
private Timer timer;
private Handler handler;
private Button startButton;
private Button aumentaButton;
private Button diminuisciButton;
private Button stopButton;
private TextView visualizzaBpm;
private long bpm = 120;
private String bpmString;
private long delay;
private int n = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = findViewById(R.id.start);
stopButton = findViewById(R.id.stop);
aumentaButton = findViewById(R.id.aumenta);
diminuisciButton = findViewById(R.id.diminusci);
visualizzaBpm = findViewById(R.id.bpmview);
bpmString = String.valueOf(bpm);
visualizzaBpm.setText(bpmString);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (timer == null) {
startMetronome();
}
}
});
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopMetronome();
bpmString = String.valueOf(bpm);
visualizzaBpm.setText(bpmString);
}
});
aumentaButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bpm += 5;
if (timer != null) {
timer.cancel();
timer = null;
startMetronome();
}
bpmString = String.valueOf(bpm);
visualizzaBpm.setText(bpmString);
}
});
diminuisciButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bpm -= 5;
if (timer != null) {
timer.cancel();
timer = null;
startMetronome();
}
bpmString = String.valueOf(bpm);
visualizzaBpm.setText(bpmString);
}
});
}
private void startMetronome() {
delay = 60000 / bpm; // Ritardo tra i battiti in millisecondi
timer = new Timer();
handler = new Handler(Looper.getMainLooper());
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
playMetronomeBeep();
}
});
}
};
timer.scheduleAtFixedRate(task, delay, delay);
}
private void playMetronomeBeep() {
ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
toneGenerator.startTone(ToneGenerator.TONE_PROP_BEEP, 200); // Durata e frequenza del beep
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
toneGenerator.stopTone();
toneGenerator.release();
}
private void stopMetronome() {
if (timer != null) {
timer.cancel();
timer = null;
handler = null;
}
}
}