我正在制作功能简单的音乐播放器应用程序。但是,当我在 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();
}
我不知道为什么这不起作用。在 list 中我有 WAKE_LOCK 权限。我还为媒体播放器设置了唤醒锁。
编辑: 今天我尝试将加载歌曲移至 onPlayFromMediaId 中。我从 AutoActivity 进行广播,其中媒体播放器到主 Activity ,并发送回 onPlayFromMediaId 和歌曲路径。但似乎这也不起作用。我还发现用按钮改变音量也会唤醒应用程序。
编辑2: 我做了很多测试,并在代码的很多地方添加了调试字符串。我发现应用程序停止在 mediaplayer.prepare() 处,直到我触发手机上的任何操作(打开显示屏、调高/调低音量、单击耳机按钮)。但我不知道如何修复这个错误。我尝试使用prepareAsync,但没有帮助。
最佳答案
除非您使用前台服务,否则系统将终止您的进程并且媒体播放器将停止。 以下是前台服务的一部分(通知示例)。
builder.setContentTitle(aMessage) // required
.setSmallIcon(R.mipmap.ic_launcher)
.setContentText(this.getString(R.string.app_name)) // required
.setAutoCancel(false)
.setContentIntent(pendingIntent)
.setVibrate(new long[]{0L})
.setPriority(Notification.PRIORITY_HIGH);
int mId = 1489;
startForeground(mId, builder.build());
以上代码经过测试,运行良好。
关于java - Android 媒体播放器在后台停止播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771947/