Android 媒体播放器点击按钮下一首歌曲

Android mediaplayer next song onButton Click

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]所以总是有一首歌没有播放。 我该如何解决这个问题,或者是否有更简单的方法也可以转到下一首歌曲?

谢谢, -文斯

编辑;

问题2;当我选择一首歌曲时,假设位置为 37,我点击上一首它会转到 36,但如果我然后单击下一首它会转到 38,所以它会跳过我先播放的歌曲。

编辑 2; 好的问题仍然存在,但我发现当我在上一个 btn 上单击几次时,假设我从位置 25 开始并使用上一个 btn 转到 15,然后当我再次单击下一个时,它只是从 25 开始计数.我该如何解决这个问题?提前致谢,-文斯

好的,你这里有几个问题:

i found out that when i click a few times on previous btn let's say i start from position 25 and go to 15 with the previous btn, and when i then click on next again it just starts to count from 25

在 PlayNext 的第一行中,您将 songIndex 重新分配给传递给 activity 的原始 songIndex。 PlayPrevious 使用另一个我看不到定义位置的 songIndex。如果您遵循 Android 指南 始终使用 "m" 前缀 class 属性与局部变量 ,您很容易就会意识到这一点。

So when i click on the next button, it plays the second song, but at the end of my songlist it skips the first song from the list stored in [0] and on second click it goes to [1]

用户在最后一首歌曲之后播放下一首或在第一首之后播放上一首的极端情况编码不正确。在这些情况下,您可以正确更新 songIndex,但不要调用播放。

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

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

稍微干净一些,不是吗?