【发布时间】:2018-02-13 17:00:49
【问题描述】:
我正在制作功能简单的音乐播放器应用。但是,当我在装有 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 发回。但似乎这也不起作用。我还发现用按钮改变音量也会唤醒应用程序。
编辑2: 我做了很多测试,并在代码的很多地方添加了调试字符串。我发现应用程序会在 mediaplayer.prepare() 处停止,直到我触发手机上的任何操作(打开显示屏、增大/减小音量、单击耳机按钮)。但我不知道如何修复这个错误。我尝试使用 prepareAsync,但没有帮助。
【问题讨论】:
-
您最好使用 Service 来播放音乐,并让您的 Activity 使用 Intent 或 Broadcast 与 Service 对话来控制播放。
-
本教程中使用了MediaBrowserServiceCompat。它扩展了服务类,所以它也是一个服务。但是,是的。我正在使用意图和广播。现在,当我从 Main Activity 触发 onPlayFromMediaId 时,它似乎可以正常工作。但我需要测试超过一小时才能确定。
-
我的第一个猜测是你需要在播放开始时调用
startForeground(int, Notification),如果用户暂停播放或播放完歌曲,你需要调用stopForeground(false)。 -
我做了一些测试。我在服务中添加了 startFreground,在活动中添加了 setPersistent=true,但有时玩家仍然会停止播放。我添加了一些调试字符串,发现这很可能是 loadSong 方法的问题。所以我试图改变它,但没有任何帮助。现在我正在使用 mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(path));以前我使用过 mMediaPlayer.setDataSource(path); .不知道有没有区别。我不知道可能是什么原因。