android - 我如何在 android studio 中一次播放一首歌曲
问题描述
在我的音乐播放器中,如果一首歌曲已经在播放,并且如果用户点击另一首歌曲,那么该歌曲也会开始播放。换句话说,一次播放多首歌曲,这真的很烦人。我一次想要一首歌。这意味着如果一首歌曲已经在播放,并且如果用户点击另一首歌曲,那么前一首歌曲将停止播放,而点击的歌曲将会播放。
爪哇代码
public void onItemClick(final Button b, View view, final SongInfo obj, int position) {
if(b.getText().equals("Stop")){
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
b.setText("Play");
}
else {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(obj.getSongUrl());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
seekBar.setProgress(0);
seekBar.setMax(mediaPlayer.getDuration());
Log.d("Prog", "run: " + mediaPlayer.getDuration());
}
});
b.setText("Stop");
}catch (Exception e){}
}
};
myHandler.postDelayed(runnable,100);
}
}
});
checkUserPermission();
Thread t = new runThread();
t.start();
}
//Thread method for seek bar
public class runThread extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("Runwa", "run: " + 1);
if (mediaPlayer != null) {
seekBar.post(new Runnable() {
@Override
public void run() {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
});
Log.d("Runwa", "run: " + mediaPlayer.getCurrentPosition());
}
}
}
}
解决方案
if("STOP".equalsIgnoreCase(b.getText()) {
mediaPlayer.stop() // stop the media player
mediaPlayer.reset() // reset media player for re-use
b.setText("Play"); // to re-play song
} else {
// use the same instance of media-player if want to play single song at a time
mediaPlayer.setDataSource(obj.getSongUrl());
mediaPlayer.prepare(); // can use prepareAsync() also
mediaPlayer.start();
b.setText("Stop");
}
要一次只播放一首歌曲,您必须mediaPlayer
始终使用相同的对象实例。(见内联评论)
参考:媒体播放器状态图
推荐阅读
- powershell - 我想在我的桌面上执行“google chrome”的目标路径
- macos - SSH 使用端口转发时显示错误的 IP 地址
- azure-data-factory - 自动缩放按需 HDInsight 群集
- macos - setsockopt() 的 macOS SO_REUSEPORT
- c# - Xamarin.Forms 找不到 EntityFramework.Core 的迁移
- travis-ci - 为什么 Travis-CI 用 18 秒来构建一个简单的 C 代码?
- javascript - Vuetify 数据表列过滤
- firebird - 在包含共享值的行之间具有 MAX 值的计算表列
- amazon-web-services - AWS Cognito:如何防止使用同一个电子邮件地址进行多次注册?
- javascript - 圆角甜甜圈图 - 有可能吗?