停止音频,无论是否延迟



我有一个按钮。当我点击它时,会播放音频。该音频总是会有延迟地重复。也就是说,音频将被播放,然后暂停5秒,然后它将被反复播放。到目前为止,这还不错。

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;
// 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());
mediaPlayer.setOnCompletionListener(listener -> Helper.setTimeout(() -> mediaPlayer.start(), 5000));
}
}
/**
* 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);
}
}
public static void setTimeout(Runnable runnable, int delay) {
new Handler(Looper.getMainLooper()).postDelayed(runnable, delay);
}

问题

我的按钮使用toggle()。所以当我点击它时,音频会播放,当我再次点击时,它应该停止。在我添加setOnCompletionListener()之前,这种方法一直很好。所以现在音频只有在播放时才会停止。但当我在5000毫秒延迟期间点击该按钮时,它将不起作用。

我希望我的切换按钮能工作,不管有没有延迟。那么,有没有办法取消CompletionListener?

代码中有趣的部分是getStatus()。你应该利用它。不知怎么的,就像这样:

public class Scanner {
public static MediaPlayer mediaPlayer = new MediaPlayer();
public View mView;
private Context mContext;
public boolean status;
private boolean mScannerIsWating = false;
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;
// Activate the scanner
if (!mediaPlayer.isPlaying() && !getStatus()) {
this.start();
}
// Deactivate the scanner
else if (mediaPlayer.isPlaying() || getStatus()) {
this.stop();
}
}
/**
* Star the scanner
*/
@SuppressLint("UseCompatLoadingForColorStateLists")
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void start() {
if (!mediaPlayer.isPlaying()) {
setStatus(true);
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(() -> {
if (getStatus()) {
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();
}
}
/**
* Stop the scanner
*/
@SuppressLint("UseCompatLoadingForColorStateLists")
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void stop() {
setStatus(false);
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mView.setBackgroundTintList(null);
Snackbar.make(mView, "Scanner is OFF", Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}

提示:您应该删除mediaPlayer.release(),否则在停止和启动媒体播放器时可能会出现错误。

最新更新