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);
    }
});