Android mediaplayer下一首歌onButton Click

时间:2017-11-28 23:26:52

标签: java android android-mediaplayer

Button btnPlayPause, btnNext, btnPrevious;
Bundle b;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_song);

    btnPlayPause = (Button) findViewById(R.id.btnPlayPause);
    btnNext = (Button) findViewById(R.id.btnNext);
    btnPrevious = (Button) findViewById(R.id.btnPrevious);

    Intent currSong = getIntent();
    b = currSong.getExtras();

    btnPlayPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        btnPlayPause.setText("Play");
                    } else {
                        mediaPlayer.start();
                        btnPlayPause.setText("Stop");
                    }
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            btnPlayPause.setText("Play");
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
    btnNext.setOnClickListener(new View.OnClickListener() {
        int songIndex = (int) b.get("songIndex");
        @Override
        public void onClick(View v) {
            if (songIndex < songList.size() - 1) {
                songIndex = songIndex + 1;
                Toast.makeText(getApplicationContext(), "You Clicked " + songIndex , Toast.LENGTH_SHORT).show();
                try {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    mediaPlayer.setDataSource(songList.get(songIndex).getData());
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });

                } catch (Exception e) {

                    e.printStackTrace();

                }
            }else{
                songIndex=0;
            }
        }
    });

    btnPrevious.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (songIndex > 0){
                songIndex = songIndex-1;
                Toast.makeText(getApplicationContext(), "You Clicked " + songIndex , Toast.LENGTH_SHORT).show();
                try {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    mediaPlayer.setDataSource(songList.get(songIndex).getData());
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });

                } catch (Exception e) {

                    e.printStackTrace();

                }
            }else {
                songIndex = songList.size() - 1;
            }
        }
    });
}

}

所以当我点击下一个按钮时,它会播放第二首歌曲,但是在我的歌曲列表的末尾,它会从[0]中存储的列表中跳过第一首歌曲,然后在第二次点击时会转到[1]所以那里总是有一首歌没有播放。 我怎样才能解决这个问题,还是有一种更方便的方式去下一首歌?

谢谢, -Vince

EDIT;

问题2;当我选择一首歌时,让我们说位置37,然后点击之前它会转到36,但如果我然后点击下一步就会转到38,所以它会跳过我先播放的歌曲。

编辑2; 好的问题仍然存在,但我发现,当我在之前的btn上点击几次时,让我说我从第25位开始并使用之前的btn转到15,然后当我再次点击下一步它再次从25开始计数我怎么解决这个问题?提前谢谢, - vince

1 个答案:

答案 0 :(得分:0)

好的,你有几个问题:

  

我发现,当我在之前的btn上点击几次时,让我说我从第25位开始,然后用前一个btn转到15,当我再次点击下一步时,它才开始计数从25

在PlayNext的第一行中,您将songIndex重新分配给传递给活动的原始songIndex。 PlayPrevious使用另一个我无法看到定义位置的songIndex。如果您遵循Android指南始终使用“m”类别属性与局部变量作为前缀,那么您很容易意识到这一点。

  

所以当我点击下一个按钮时,它会播放第二首歌曲,但是在我的歌曲列表的末尾它会从[0]中存储的列表中跳过第一首歌曲,然后在第二次点击时会跳到[1]

用户在最后一首歌曲之后播放下一首歌曲的边缘情况,或者在第一首歌曲之后的前一首歌曲被错误编码。在这些情况下,您正确更新songIndex,但不要调用play。

除了问题之外,你应该做的是使用函数稍微修改你的代码,以避免重复功能。这总是容易出现这种错误。我建议这样的事情:

int mCurrentIndex; // always prefix class properties with an "m"

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_song);

    Button  btnPlayPause = (Button) findViewById(R.id.btnPlayPause),
            btnNext = (Button) findViewById(R.id.btnNext),
            btnPrevious = (Button) findViewById(R.id.btnPrevious);

    Intent currSong = getIntent();
    Bundle b = currSong.getExtras();

    // load initial index only once
    mCurrentIndex = (int) b.get("songIndex");

    btnPrevious.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCurrentIndex = mCurrentIndex > 0 ? mCurrentIndex - 1 : mSongList.size() - 1;
            playSongNumber(mCurrentIndex);
        }
    }

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCurrentIndex++;
            mCurrentIndex %= mSongList.size();
            playSongNumber(mCurrentIndex);
        }
    }

}

private void playSongNumber(int index) {

    try {
        mMediaPlayer.stop();
        mMediaPlayer.reset();
        mMediaPlayer.setDataSource(mSongList.get(index).getData());
        mMediaPlayer.prepareAsync();
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

略显清洁,不是吗?