[英]android media player on background not stop playing while open other activity
[英]Android media player stop playing while in background
我正在制作具有简单功能的音乐播放器应用。 但是,当我在使用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权限。 我还为媒体播放器设置了唤醒锁。
编辑:今天我试图将加载的歌曲移到onPlayFromMediaId中。 我从AutoActivity(是媒体播放器)向Main Activity进行广播,然后将onPlayFromMediaId和歌曲的路径发送回去。 但是似乎这也不起作用,我还发现用按钮改变音量也会唤醒应用程序。
Edit2:我进行了许多测试,并在代码的许多地方添加了调试字符串。 我发现该应用程序停止在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());
上面的代码已经过测试,可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.