gpt4 book ai didi

java - Android Studio music player list 查看播放列表

转载 作者:搜寻专家 更新时间:2023-11-01 07:48:53 24 4
gpt4 key购买 nike

对于这个笨拙的问题,我深表歉意,但我正在 android studio 中构建一个音乐播放器,我遇到了歌曲像播放列表一样一首接一首播放的问题。歌曲只能手动挑选,歌曲结束后它就会停止,直到用户点击另一首歌曲。我写了两段代码,我怀疑它们可以解决这个问题,但我不确定如何实现它们,或者它们最终是否会有任何用处。我真的很感激这方面的帮助,真的可以使用它。任何建议或建设性的批评总是受欢迎的,在此先感谢。以下是 fragment :

//------------> to get the next song <---------------
int itemsInList=list.getAdapter().getCount();
for(int i=1;i<itemsInList;i++){
list.setSelection(i);
}
//--------------> to play the song on list item click <-------------------
@Override
protected void onListItemClick(ListView list, View view, int position,
long id) {
super.onListItemClick(list, view, position, id);
currentFile = (String) view.getTag();
startPlay(currentFile);
}

这里仅供引用是我的主要 java 文件:

public class MainActivity extends ListActivity {

private static final int UPDATE_FREQUENCY = 500;
private static final int STEP_VALUE = 4000;

private MediaCursorAdapter mediaAdapter = null;
private TextView selectedFile = null;
private SeekBar seekbar = null;
private MediaPlayer player = null;
private ListView list = null;
private ImageButton playButton = null;
private ImageButton prevButton = null;
private ImageButton nextButton = null;
private ImageButton btNext = null;
private ImageButton btPrev = null;

private boolean isStarted = true;
private String currentFile = "";
private boolean isMovingSeekBar = false;

private final Handler handler = new Handler();

private final Runnable updatePositionRunnable = new Runnable() {
public void run() {
updatePosition();
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

selectedFile = (TextView) findViewById(R.id.selectedfile);
seekbar = (SeekBar) findViewById(R.id.seekbar);
playButton = (ImageButton) findViewById(R.id.play);
prevButton = (ImageButton) findViewById(R.id.prev);
nextButton = (ImageButton) findViewById(R.id.next);
btNext = (ImageButton) findViewById(R.id.btNxt);
btPrev = (ImageButton) findViewById(R.id.btPrev);

player = new MediaPlayer();

player.setOnCompletionListener(onCompletion);
player.setOnErrorListener(onError);
seekbar.setOnSeekBarChangeListener(seekBarChanged);

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

if (null != cursor) {
cursor.moveToFirst();

mediaAdapter = new MediaCursorAdapter(this, R.layout.list_item, cursor);

setListAdapter(mediaAdapter);

playButton.setOnClickListener(onButtonClick);
nextButton.setOnClickListener(onButtonClick);
prevButton.setOnClickListener(onButtonClick);
btNext.setOnClickListener(onButtonClick);
btPrev.setOnClickListener(onButtonClick);

}
}

//----------- ??? ----------------------------------------------------------------
int itemsInList=list.getAdapter().getCount();
for(int i=1;i<itemsInList;i++){
list.setSelection(i);
}

@Override
protected void onListItemClick(ListView list, View view, int position, long id) {
super.onListItemClick(list, view, position, id);
currentFile = (String) view.getTag();
startPlay(currentFile);
}
// --------------------------------------------------------------------------------

@Override
protected void onDestroy() {
super.onDestroy();

handler.removeCallbacks(updatePositionRunnable);
player.stop();
player.reset();
player.release();

player = null;
}

private void startPlay(String file) {
Log.i("Selected: ", file);

selectedFile.setText(file);
seekbar.setProgress(0);

player.stop();
player.reset();

try {
player.setDataSource(file);
player.prepare();
player.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

seekbar.setMax(player.getDuration());
playButton.setImageResource(android.R.drawable.ic_media_pause);

updatePosition();

isStarted = true;
}

private void stopPlay() {
player.stop();
player.reset();
playButton.setImageResource(android.R.drawable.ic_media_play);
handler.removeCallbacks(updatePositionRunnable);
seekbar.setProgress(0);

isStarted = false;
}

private void updatePosition() {
handler.removeCallbacks(updatePositionRunnable);

seekbar.setProgress(player.getCurrentPosition());

handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY);
}

private class MediaCursorAdapter extends SimpleCursorAdapter {

public MediaCursorAdapter(Context context, int layout, Cursor c) {
super(context, layout, c,
new String[]{MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION},
new int[]{R.id.displayname, R.id.title, R.id.duration});
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView title = (TextView) view.findViewById(R.id.title);
TextView name = (TextView) view.findViewById(R.id.displayname);
TextView duration = (TextView) view.findViewById(R.id.duration);

name.setText(cursor.getString(
cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)));

title.setText(cursor.getString(
cursor.getColumnIndex(MediaStore.MediaColumns.TITLE)));

long durationInMs = Long.parseLong(cursor.getString(
cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION)));

double durationInMin = ((double) durationInMs / 1000.0) / 60.0;

durationInMin = new BigDecimal(Double.toString(durationInMin)).setScale(2, BigDecimal.ROUND_UP).doubleValue();

duration.setText("" + durationInMin);

view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)));
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.list_item, parent, false);

bindView(v, context, cursor);

return v;
}
}

private View.OnClickListener onButtonClick = new View.OnClickListener() {

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play: {
if (player.isPlaying()) {
handler.removeCallbacks(updatePositionRunnable);
player.pause();
playButton.setImageResource(android.R.drawable.ic_media_play);
} else {
if (isStarted) {
player.start();
playButton.setImageResource(android.R.drawable.ic_media_pause);

updatePosition();
} else {
startPlay(currentFile);
}
}

break;
}
case R.id.next: {
int seekto = player.getCurrentPosition() + STEP_VALUE;

if (seekto > player.getDuration())
seekto = player.getDuration();

player.pause();
player.seekTo(seekto);
player.start();

break;
}
case R.id.prev: {
int seekto = player.getCurrentPosition() - STEP_VALUE;

if (seekto < 0)
seekto = 0;

player.pause();
player.seekTo(seekto);
player.start();

break;
}
case R.id.btNxt: {
//TO DO
}
case R.id.btPrev: {
//TO DO
}
}
}
};

private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
stopPlay();
}
};

private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() {

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {

return false;
}
};

private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
isMovingSeekBar = false;
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isMovingSeekBar = true;
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (isMovingSeekBar) {
player.seekTo(progress);

Log.i("OnSeekBarChangeListener", "onProgressChanged");
}
}
};

最佳答案

你可以看看我下面的方法来播放下一首歌曲。希望对您有所帮助。

public static void nextSong() {
int numOfSong = songList.size();

if (!isShuffle) { // Shuffle mode is off
if (currentPosition < numOfSong - 1) {
currentPosition++;
currentSong = songList.get(currentPosition);
Log.d("my_log", "position = "+currentPosition);
playBackMusic();
} else {
currentPosition = 0;
currentSong = songList.get(currentPosition);
Log.d("my_log", "position = "+currentPosition);
playBackMusic();
}
} else { // Shuffle mode is on
Random rand = new Random();
currentPosition = rand.nextInt(numOfSong);
currentSong = songList.get(currentPosition);
Log.d("my_log", "position = "+currentPosition);
playBackMusic();
}
}

这是播放歌曲的 playBackMusic() 方法:

public static void playBackMusic() {
try {
mediaPlayer.release();

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(currentSong.getPath());
mediaPlayer.prepare();

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
endOfTheSong();
}
});

isPlaying = true;
mediaPlayer.start();

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

方法 endOfTheSong() 处理当前歌曲播放后的操作。

public static void endOfTheSong() {
if (isRepeat == 1) { // currently repeat one song
mediaPlayer.seekTo(0);
mediaPlayer.start();
} else if (isRepeat == 2) { // currently repeat all songs
nextSong();
} else { // currently no repeat

if (currentPosition != songList.size() - 1) nextSong();

}
}

关于java - Android Studio music player list 查看播放列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38257657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com