gpt4 book ai didi

java - 如何让歌曲在关闭手机屏幕后仍继续播放到列表末尾?

转载 作者:行者123 更新时间:2023-12-02 05:54:29 25 4
gpt4 key购买 nike

我是 Android 初学者。我创建了一个特定乐队的应用程序演示,并使得在线收听他们的所有歌曲成为可能。完整代码您可以在这里查看 https://github.com/Turskyi/Online_music_player_for_particular_music_band 但遇到两个问题。

  1. 首先。我必须选择是否在切换 Activity 后继续播放歌曲,或者在离开 Activity 后停止媒体播放器。但我想通过关闭屏幕来继续播放歌曲,但在更改 Activity 时停止播放。
  2. 第二个问题。我无法有效地实现数组,在单击任何歌曲并强制它们一首一首地播放到列表末尾然后停止后,该数组将使用列表中的剩余歌曲创建。
public class ZombiActivity extends AppCompatActivity {
ImageView imageView;
ListView listView;
private MediaPlayer mMediaPlayer;

/*Handles audio focus when playing a sound file */
private AudioManager mAudioManager;

AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener =
new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ||
focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
//The AUDIOFOCUS_LOSS_TRANSIENT case means that we've lost audio focus
//short amount of time. The AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK case means
//our app is allowed to continue playing sound but at a lower volume.

//Pause playback and reset player to the start of the file. That way, when
//play the song from the beginning when we resume playback.
mMediaPlayer.pause();
mMediaPlayer.seekTo(0);
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
//The AUDIOFOCUS_GAIN case means we have regained focus and can
//resume playback
mMediaPlayer.start();
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
//The AUDIOFOCUS_LOSS case means we've lost audio focus and
//stop playback and cleanup resources
releaseMediaPlayer();
}
}
};

/**
* This listener gets triggered when the {@link MediaPlayer} has completed
* playing the audio file.
*/
private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
releaseMediaPlayer();
}
};
// Create an array of songs
final ArrayList<Song> songs = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song_list);
//Create and setup the {@link AudioManager} to request audio focus
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.zombi_txt);
BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bmp);
listView = findViewById(R.id.list);
listView.setBackground(bitmapDrawable);

// Create a list of songs
songs.add(new Song("відчуття.тиші", "Зомбі", R.drawable.zombi,
"https://storage.mp3cc.biz/listen/57951498" +
"/ZHJMMXFDNzVSOTd6Zm5CK2lTckJ2cTQ1WlcxWUpET2phbW11Z2JuNVd6SU51a2I0SEluUUhGUzNKNDQxM2xLbm14cUF4cmNYaXlTYnNCa3o3VnNYd1F4SjN4Y3ZEb3JCSTJFWUowYkRjY3J4K0tGM2F4dkRZb1FvYklvRzFqZEk" +
"/v-dchuttya.tish-zomb_(mp3CC.biz).mp3"));
songs.add(new Song("відчуття.тиші",
"Зомбі (aContrari Post-Apocalyptic Dubstep Mix)", R.drawable.vt_dnb120,
"https://storage.mp3cc.biz/listen/17574914" +
"/ZHJMMXFDNzVSOTd6Zm5CK2lTckJ2cTQ1WlcxWUpET2phbW11Z2JuNVd6TFBhQmFNaDlqSGFYZDVqZEZRMWErS0xWeVJQamJwTlpKK3hMQUxqV2NDUkZ0Zkp4a0hTek5za0hYN1JvWjFmTUw0RmFwMVdGWGZGbkI1VXVmYWFMU0w" +
"/v-dchuttya.tish-zomb-acontrari-post-apocalyptic-dubstep-mix_(mp3CC.biz).mp3"));
songs.add(new Song("відчуття.тиші", "ゾンビ", R.drawable.zombi,
"https://storage.mp3cc.biz/listen/57951499" +
"/ZHJMMXFDNzVSOTd6Zm5CK2lTckJ2cTQ1WlcxWUpET2phbW11Z2JuNVd6TFlKWUs5aW0raFZ3MmlJMFpiS3E1NVRYSUw2andvQS9QaHk4ZUVQVklkdjZYbFgzekYyTnlNL0lHY3BJdzFrRDFjbHVSZ3I1S1lGdHE2Z0R4NkRKRzk" +
"/v-dchuttya.tish-_(mp3CC.biz).mp3"));
// Create an {@link SongAdapter}, whose data source is a list of {@link Song}s. The
// adapter knows how to create list items for each item in the list.
SongAdapter adapter = new SongAdapter(this, songs, R.color.category_zombi);
listView.setAdapter(adapter);
//Set a click listener to play the audio when the list item is clicked on
listView.setOnItemClickListener(firstClickListener);
}

/**
* Checks the device is online or not
*/
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);

} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}

AdapterView.OnItemClickListener firstClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (isOnline()) {
//Get the {@link Word} object at the given position the user clicked on
Song song = songs.get(position);

//Release the media player if it currently exists because we are about to
//play a different sound file.
releaseMediaPlayer();
imageView = view.findViewById(R.id.btn_image);
imageView.setImageResource(R.drawable.ic_pause);
//Request audio focus for playback
int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener,
//Use the music stream.
AudioManager.STREAM_MUSIC,
//Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
//We have an audio focus now.

// Create and setup the {@link MedeaPlayer} for the audio resource associated
// with the current word
String url = song.getmAudioResourceId(); // your URL here
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(url);
} catch (IOException e) {
Toast.makeText(view.getContext(),
"No internet", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
try {
mMediaPlayer.prepare(); // might take long! (for buffering, etc)
} catch (IOException e) {
e.printStackTrace();
}
// Start the audio file
mMediaPlayer.start();

//Setup a listener on the media player, so that we can stop and release the
//media player once the sounds has finished
mMediaPlayer.setOnCompletionListener(mCompletionListener);

listView.setOnItemClickListener(secondClickListener);
} else {
Toast.makeText(view.getContext(),
"No internet", Toast.LENGTH_SHORT).show();
}
}
}
};
AdapterView.OnItemClickListener secondClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mMediaPlayer.pause();
imageView.setImageResource(R.drawable.ic_play_arrow);
listView.setOnItemClickListener(firstClickListener);
}
};

@Override
protected void onStop() {
super.onStop();
//When the activity is stopped, release the media player resources because we won't
//be playing any more sounds.
releaseMediaPlayer();
}

/**
* Clean up the media player by releasing its resources.
*/
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mMediaPlayer != null) {
// Regardless of the current state of the media player, release its resources
// because we no longer need it.
mMediaPlayer.release();

// Set the media player back to null. For our code, we've decided that
// setting the media player to null is an easy way to tell that the media player
// is not configured to play an audio file at the moment.
mMediaPlayer = null;
}
}
}

似乎答案很明显,但我就是不明白。如果您能够指出我需要进行的更改,以便更改代码,以便即使在按下“关闭”按钮后,歌曲也会播放到列表末尾。

最佳答案

对于最后一首歌曲,您可以检查下面的代码,也可以播放下一首歌曲,如果它是播放列表中的最后一首歌曲,则重复播放:)

if (audioIndex == audioList.size() - 1) {
//if last in playlist
audioIndex = 0;
activeAudio = audioList.get(audioIndex);
} else {
//get next in playlist
activeAudio = audioList.get(++audioIndex);
}

关于java - 如何让歌曲在关闭手机屏幕后仍继续播放到列表末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56024907/

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