Android媒体播放器未按预期工作

时间:2017-12-28 03:28:48

标签: java android android-studio android-mediaplayer

我刚刚开始使用Android刚刚开始使用Android,目前引用了过去2天的以下代码,无法解决问题。

代码: https://github.com/quocnguyenvan/media-player-demo

问题:当我们点击第一首歌曲播放它一段时间后,让我们说ListView中的4首歌曲并暂停它而不点击停止。 一旦我们点击第二首歌开始播放第一首歌,我们就无法播放第二首歌,除非我们点击第一首歌的停止如何解决这个问题。

代码无法弄清楚并修复它的问题。我在发布StackOverflow之前已经提到了很多帖子但是无法做到,任何建议或指导都受到高度赞赏。

有问题的代码:

// play music
    viewHolder.ivPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(flag){
                mediaPlayer = MediaPlayer.create(context, music.getSong());
                flag = false;
            }
            if(mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                viewHolder.ivPlay.setImageResource(R.drawable.ic_play);
            } else {
                mediaPlayer.start();
                viewHolder.ivPlay.setImageResource(R.drawable.ic_pause);
            }
        }
    });

    // stop
    viewHolder.ivStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!flag) {
                mediaPlayer.stop();
                mediaPlayer.release();
                flag = true;
            }
            viewHolder.ivPlay.setImageResource(R.drawable.ic_play);
        }
    });

2 个答案:

答案 0 :(得分:0)

这些是我用来播放歌曲的步骤,您可以尝试与我的步骤同步以解决错误。

  private void initMembers() {
    //initialize the members here
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    //media prepare
    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(final MediaPlayer mediaPlayer) {
            //media player prepared
            togglePlayPausePlayer();
        }
    });

    //media completion
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(final MediaPlayer mediaPlayer) {
            //handle the media play completion
            handleOnCompletionLogic();
        }
    });
}
之后,每当我尝试播放这首歌时。我称这种方法。

 public void playMusic(final MusicModel musicModel) {
    //here play the music with data in below
    try {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
        mMediaPlayer.reset();
        mMediaPlayer.setDataSource(musicModel.getUrl());
        mMediaPlayer.prepareAsync();
    } catch (IOException | IllegalStateException exp) {
        exp.printStackTrace();
        showMessage(getString(R.string.error_unable_play));
    }
}
上面

重置播放的歌曲并为另一首歌准备播放器。 和OnPreparedListener它调用togglePlayPausePlayer(),相应地播放和暂停歌曲。

 private void togglePlayPausePlayer() {
        //here handle the logic for play and pause the player
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
            setPlayAndPause(false);
        } else {
            mMediaPlayer.start();
            setPlayAndPause(true);
        }
    }

关键是我们初始化播放器并设置onPrepareListener以供媒体播放器准备然后播放歌曲,这将检查它是否正在播放然后它将停止,否则它将播放。
希望这可以帮到你。

答案 1 :(得分:0)

要点击ListView,您需要重置媒体播放器,更改数据源并开始播放新歌。

mp.reset();
mp.setDataSource("song you selected from ListView");
mp.prepare();
mp.start();