繁体   English   中英

Android Media Player在后台停止播放

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM