簡體   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