Android Media Player在后台停止播放 [英] Android media player stop playing while in background

查看:573
本文介绍了Android Media Player在后台停止播放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作具有简单功能的音乐播放器应用.但是,当我在装有Android 6的手机上听音乐时,有时音乐会停止播放,直到用电源按钮再次打开显示屏.然后正在播放下一首歌曲,因此加载下一首歌曲似乎有问题.我试图编写新的应用程序只是为了对其进行测试,为此,我使用了本教程: https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030

I'm making music player app with simple functionality. But when I listen music on my phone with Android 6, sometimes music stops playing until I turn on display again with power button. Then next song is playing, so it seems like it's problem with loading next song. I tried to write new app just to test it out, for this purpose I used this tutorial: https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030

在此示例中,我添加了带有歌曲路径的ArrayList.在mediaPlayer onCompletionListener中,我增加了曲目计数器并将新歌曲加载到媒体播放器.

To this example I added ArrayList with paths to songs. In mediaPlayer onCompletionListener I increase track counter and load new song to media player.

我的代码:

    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权限.我还为媒体播放器设置了唤醒锁.

I don't know anymore why this doesn't work. In manifest I have WAKE_LOCK permission. I also set wake lock for Media player.

今天,我尝试将加载歌曲移至onPlayFromMediaId.我从AutoActivity(是媒体播放器)向Main Activity进行了广播,然后将onPlayFromMediaId和歌曲的路径发送回去.但这似乎也不起作用.我还发现,使用按钮更改音量也会唤醒应用程序.

Today I tried to move loading song into onPlayFromMediaId. I made broadcast from AutoActivity where is Media player to Main Activity and send back onPlayFromMediaId with path to song. But seems like this doesn't work either.I also find out that changing volume with buttons also wake up app.

Edit2: 我进行了许多测试,并在代码的许多地方添加了调试字符串.我发现该应用程序停止在mediaplayer.prepare()上,直到我触发手机上的任何操作(打开显示屏,调高/调低音量,单击耳机按钮).但是我不知道如何解决这个错误.我尝试使用prepareAsync,但没有帮助.

I made many tests and added debug string in many places in code. And I found out that app stops at mediaplayer.prepare() until I trigger any action on phone (turn on display, volume up/down, click headset button). But I don't know how to fix this bug. I tried to use prepareAsync, but didn't help.

推荐答案

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

Unless you use foreground service, the system will kill your process and mediaplayer will stop. below is a part from from a foreground service ( notification example).

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

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

The above code is tested and working fine.

这篇关于Android Media Player在后台停止播放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆