Mediaplayer - 单击新音频时停止当前音频
Mediaplayer - stop current audio when clicking on new audio
我是 android 工作室的新手(一般编程),但我想构建一个用于学习目的的媒体播放器。
我在包含 2 个图像的 listView 中有一个本地音乐列表 'play, pause and stop button'。
我的应用程序是这样工作的:
- 点击播放按钮 -> 开始播放音乐
- 点击暂停按钮 -> 暂停音乐
- 点击停止按钮 -> 停止音乐
很简单。但!问题是 -> 当我暂停一首歌曲并想播放列表中的另一首歌曲时,它会继续播放我点击的第一首歌曲。
我希望它发布第一首歌曲并开始我点击的另一首歌曲。
这是我的代码:
// play music
viewHolder.playB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag) {
//get song you clicked on
mediaPlayer = MediaPlayer.create(context, song.getSong());
//set boolean to false so it can get ANOTHER song when
//clicked
flag = false;
Toast.makeText(context, "Playing" + song.getName(),
Toast.LENGTH_LONG).show();
}
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
viewHolder.playB.setImageResource(R.drawable.play);
} else {
mediaPlayer.start();
viewHolder.playB.setImageResource(R.drawable.pause);
}
}
});
// stop
viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!flag) {
mediaPlayer.stop();
mediaPlayer.release();
flag = true;
}
viewHolder.playB.setImageResource(R.drawable.play);
}
});
你的逻辑有点不对。当您创建 MediaPlayer 时,您将 flag
设置为 false
,只要您不停止播放,flag
就不会改变。但是您的 MediaPlayer 创建取决于它。
为了将来的改进(也许当你对使用 MediaPlayer 和 Android 更有信心时)你应该看看更 "self-made" 的方法而不是 MediaPlayer.create(...)
因为这个方法正在调用 MediaPlayer 的 prepare()
方法,该方法最终会使您的应用在加载大文件时速度极慢或崩溃。
根据评论举例
我假设 song
将成为 class 对象。
// class variable will hold the currently loaded song
private Song mCurrentSong;
[...]
viewHolder.playB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// MediaPlayer has not been initialized OR clicked song is not the currently loaded song
if (mCurrentSong == null || song != mCurrentSong) {
// Sets the currently loaded song
mCurrentSong = song;
mediaPlayer = MediaPlayer.create(context, song.getSong());
Toast.makeText(context, "Playing" + song.getName(),
Toast.LENGTH_LONG).show();
}
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
viewHolder.playB.setImageResource(R.drawable.play);
} else {
mediaPlayer.start();
viewHolder.playB.setImageResource(R.drawable.pause);
}
}
});
viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// If currently loaded song is set the MediaPlayer must be initialized
if (mCurrentSong != null) {
mediaPlayer.stop();
mediaPlayer.release();
mCurrentSong = null; // Set back currently loaded song
}
viewHolder.playB.setImageResource(R.drawable.play);
}
});
我是 android 工作室的新手(一般编程),但我想构建一个用于学习目的的媒体播放器。
我在包含 2 个图像的 listView 中有一个本地音乐列表 'play, pause and stop button'。
我的应用程序是这样工作的:
- 点击播放按钮 -> 开始播放音乐
- 点击暂停按钮 -> 暂停音乐
- 点击停止按钮 -> 停止音乐
很简单。但!问题是 -> 当我暂停一首歌曲并想播放列表中的另一首歌曲时,它会继续播放我点击的第一首歌曲。
我希望它发布第一首歌曲并开始我点击的另一首歌曲。
这是我的代码:
// play music
viewHolder.playB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag) {
//get song you clicked on
mediaPlayer = MediaPlayer.create(context, song.getSong());
//set boolean to false so it can get ANOTHER song when
//clicked
flag = false;
Toast.makeText(context, "Playing" + song.getName(),
Toast.LENGTH_LONG).show();
}
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
viewHolder.playB.setImageResource(R.drawable.play);
} else {
mediaPlayer.start();
viewHolder.playB.setImageResource(R.drawable.pause);
}
}
});
// stop
viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!flag) {
mediaPlayer.stop();
mediaPlayer.release();
flag = true;
}
viewHolder.playB.setImageResource(R.drawable.play);
}
});
你的逻辑有点不对。当您创建 MediaPlayer 时,您将 flag
设置为 false
,只要您不停止播放,flag
就不会改变。但是您的 MediaPlayer 创建取决于它。
为了将来的改进(也许当你对使用 MediaPlayer 和 Android 更有信心时)你应该看看更 "self-made" 的方法而不是 MediaPlayer.create(...)
因为这个方法正在调用 MediaPlayer 的 prepare()
方法,该方法最终会使您的应用在加载大文件时速度极慢或崩溃。
根据评论举例
我假设 song
将成为 class 对象。
// class variable will hold the currently loaded song
private Song mCurrentSong;
[...]
viewHolder.playB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// MediaPlayer has not been initialized OR clicked song is not the currently loaded song
if (mCurrentSong == null || song != mCurrentSong) {
// Sets the currently loaded song
mCurrentSong = song;
mediaPlayer = MediaPlayer.create(context, song.getSong());
Toast.makeText(context, "Playing" + song.getName(),
Toast.LENGTH_LONG).show();
}
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
viewHolder.playB.setImageResource(R.drawable.play);
} else {
mediaPlayer.start();
viewHolder.playB.setImageResource(R.drawable.pause);
}
}
});
viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// If currently loaded song is set the MediaPlayer must be initialized
if (mCurrentSong != null) {
mediaPlayer.stop();
mediaPlayer.release();
mCurrentSong = null; // Set back currently loaded song
}
viewHolder.playB.setImageResource(R.drawable.play);
}
});