安卓媒体播放器在后台停止播放

4
我正在制作一个具有简单功能的音乐播放器应用程序。但是,当我在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,但没有帮助。


最好使用服务来播放音乐,并使用意图或广播让您的活动与服务通信以控制播放。 - cwbowron
在本教程中,使用了MediaBrowserServiceCompat。它扩展了Service类,因此也是一个服务。但是,是的,我正在使用意图和广播。目前,当我从主活动触发onPlayFromMediaId时,它似乎正在工作。但我需要测试超过一小时才能确定。 - Hato
我的第一个猜测是,当播放开始时,您需要调用 startForeground(int, Notification),然后如果用户暂停播放或完成播放歌曲,则调用 stopForeground(false) - Nikki Borrelli
我进行了一些测试。我在服务中添加了startForeground,并在活动中设置了setPersistent=true,但有时播放器仍会停止播放。我添加了一些调试字符串并发现最可能是loadSong方法的问题。所以我尝试更改它,但没有帮助。现在我正在使用mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(path));之前我使用了mMediaPlayer.setDataSource(path);。我不知道它们之间是否有任何区别。我已经没有任何想法可以解决这个问题了。 - Hato
1个回答

1
除非使用前台服务,否则系统会终止您的进程并停止媒体播放器。 以下是前台服务(通知示例)的一部分。
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());

上述代码已经测试并且正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接