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

标签 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();
    }

我不知道为什么这不起作用。在 list 中我有 WAKE_LOCK 权限。我还为媒体播放器设置了唤醒锁。

编辑: 今天我尝试将加载歌曲移至 onPlayFromMediaId 中。我从 AutoActivity 进行广播,其中媒体播放器到主 Activity ,并发送回 onPlayFromMediaId 和歌曲路径。但似乎这也不起作用。我还发现用按钮改变音量也会唤醒应用程序。

编辑2: 我做了很多测试,并在代码的很多地方添加了调试字符串。我发现应用程序停止在 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());

以上代码经过测试,运行良好。

关于java - Android 媒体播放器在后台停止播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771947/

相关文章:

android - 通过 IMDB API 使用改造

iphone - 如何在调用 iOS sleep 定时器时停止音频

java - 在 Java 中无法访问 Maven 依赖项

JavaFX 绑定(bind)失败,返回 "Cannot bind to untyped object."

java - 如何从 Java 7 调用 Kotlin 挂起协程函数

android - 在 Android 的内部布局中设置文本字段的值

JavaScript 音频播放器

java - 如何在按下按钮时持续循环播放声音并在释放时停止?

java - 由于无状态 bean 引用,有状态 bean 钝化失败

java - 与 JRE 1.7 一起使用的 db2jcc.jar 版本错误?