Hallo,
ich habe eine Audio-Datei, die immer wiederholt wird und hierfür verwende ich die MediaPlayer-Klasse. Für die Wiederholung verwende ich nicht mediaPlayer.setLooping(true), sonder setOnCompletionListener(), da ich möchte, dass das Audio erst nach ein paar Sekunden wieder abgespielt wird. Das funktioniert soweit sehr gut aber mein Problem ist der Toggle-Knopf den ich habe. Mit einem Knopf möchte ich also den Sound abspielen und wenn er bereits gespielt wird wieder stoppen.
Die Methode stop() wird also nur ausgeführt, wenn der Sound bereits abgespielt wird. Aber in setOnCompletionListener() habe ich ja noch eine Verzögerung drin. Nachdem der Sound also abgespielt wurde, wird er nach x Sekunden wieder gespielt. Und das versteht meine toggle()-Methode irgendwie nicht so.
Wie bekomme ich es hin, dass der Sound mit oder ohne die Verzögerung gestoppt wird?
ich habe eine Audio-Datei, die immer wiederholt wird und hierfür verwende ich die MediaPlayer-Klasse. Für die Wiederholung verwende ich nicht mediaPlayer.setLooping(true), sonder setOnCompletionListener(), da ich möchte, dass das Audio erst nach ein paar Sekunden wieder abgespielt wird. Das funktioniert soweit sehr gut aber mein Problem ist der Toggle-Knopf den ich habe. Mit einem Knopf möchte ich also den Sound abspielen und wenn er bereits gespielt wird wieder stoppen.
Java:
public class Scanner {
public static MediaPlayer mediaPlayer = new MediaPlayer();
public View mView;
private Context mContext;
public boolean status;
public boolean getStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void toggle(View view, Context context) {
this.mView = view;
this.mContext = context;
Log.d(TAG, "toggle: " + getStatus());
// Activate the scanner
if (!mediaPlayer.isPlaying()) {
this.start();
}
// Deactivate the scanner
else {
this.stop();
}
}
/**
* Star the scanner
*/
@SuppressLint("UseCompatLoadingForColorStateLists")
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void start() {
if (!mediaPlayer.isPlaying()) {
mediaPlayer = MediaPlayer.create(mContext, scanner);
mediaPlayer.setOnPreparedListener(mediaPlayerListener -> mediaPlayer.start());
int scanTimer = (!Objects.equals(Helper.getSharedPreference(mContext, "scanTimer"), "")) ? Integer.parseInt(Helper.getSharedPreference(mContext,"scanTimer")) * 1000 : 0;
mediaPlayer.setOnCompletionListener(listener -> Helper.setTimeout(() -> {
mediaPlayer.start();
}, scanTimer));
// View
mView.setBackgroundTintList(mView.getResources().getColorStateList(R.color.darkRed));
Snackbar.make(mView, "Scanner is ON", Snackbar.LENGTH_LONG).setAction("Action", null).show();
setStatus(true);
}
}
/**
* Stop the scanner
*/
@SuppressLint("UseCompatLoadingForColorStateLists")
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void stop() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mView.setBackgroundTintList(null);
Snackbar.make(mView, "Scanner is OFF", Snackbar.LENGTH_LONG).setAction("Action", null).show();
setStatus(false);
}
}
}
Die Methode stop() wird also nur ausgeführt, wenn der Sound bereits abgespielt wird. Aber in setOnCompletionListener() habe ich ja noch eine Verzögerung drin. Nachdem der Sound also abgespielt wurde, wird er nach x Sekunden wieder gespielt. Und das versteht meine toggle()-Methode irgendwie nicht so.
Wie bekomme ich es hin, dass der Sound mit oder ohne die Verzögerung gestoppt wird?