Android媒体播放器在后台停止播放

时间:2018-02-13 17:00:50

标签: java android audio

我正在使用简单的功能制作音乐播放器应用。但是当我使用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进行广播,其中媒体播放器为主要活动,并发送回PlayPromMediaId以及歌曲的路径。但似乎这也不起作用。我也发现用按钮改变音量也会唤醒app。

EDIT2: 我做了很多测试,并在代码中的许多地方添加了调试字符串。我发现应用程序停在mediaplayer.prepare(),直到我在手机上触发任何操作(打开显示屏,音量增大/减小,点击耳机按钮)。但我不知道如何解决这个问题。我尝试使用prepareAsync,但没有帮助。

1 个答案:

答案 0 :(得分:0)

除非您使用前台服务,否则系统将终止您的进程并且mediaplayer将停止。 下面是来自前台服务的一部分(通知示例)。

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());

上面的代码已经过测试,可以正常工作。