我正在制作一个具有简单功能的音乐播放器应用程序。但是,当我在Android 6手机上听音乐时,有时会停止播放,直到我按下电源按钮再次打开显示屏。然后下一首歌曲会播放,所以看起来似乎是加载下一首歌曲的问题。为了测试它,我尝试编写新的应用程序,我使用了这个教程:https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030
在这个例子中,我添加了包含歌曲路径的ArrayList。在mediaPlayer onCompletionListener中,我增加了跟踪计数器并将新歌曲加载到媒体播放器中。
我的代码:
我的代码:
private void initMediaPlayer() {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setVolume(1.0f, 1.0f);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer)
{
onTrackCompletion();
}
});
private void onTrackCompletion()
{
NextTrack();
Play();
}
private void NextTrack()
{
playlistPosition++;
if (playlistPosition == playlists.get(playlistCurrent).size){
playlistPosition = 0;
}
sendAction(ACTION_TRACK_NEXT);
if(mMediaPlayer.isPlaying()){
Pause();
}
loadSong();
Play();
}
private void loadSong()
{
String path = playlists.get(playlistCurrent).getPath(playlistPosition);
if(path == null || path == "")
{
return;
}
try
{
try
{
mMediaPlayer.setDataSource(path);
} catch( IllegalStateException e ) {
mMediaPlayer.release();
initMediaPlayer();
mMediaPlayer.setDataSource(path);
}
initMediaSessionMetadata();
} catch (IOException e) {
return;
}
try {
mMediaPlayer.prepare();
} catch (IOException e) {}
sendTrackData();
}
我不知道为什么这个不起作用。在清单文件中,我有WAKE_LOCK权限。我还为Media Player设置了唤醒锁。
编辑: 今天我尝试将加载歌曲移动到onPlayFromMediaId中。我从AutoActivity向Main Activity发送广播,并带回带有歌曲路径的onPlayFromMediaId。但似乎这也不起作用。我还发现使用按钮改变音量也会唤醒应用程序。
编辑2: 我进行了许多测试,并在代码中的许多地方添加了调试字符串。我发现app在mediaplayer.prepare()处停止,直到我在手机上触发任何操作(打开显示器、调整音量、点击耳机按钮)。但是我不知道如何修复这个错误。我尝试使用prepareAsync,但没有帮助。
startForeground(int, Notification)
,然后如果用户暂停播放或完成播放歌曲,则调用stopForeground(false)
。 - Nikki Borrelli