MediaSession 没有从 MediaStyle 通知中获得暂停

问题描述

我正在开发一个应用程序,允许用户从网络流式传输播客。这是我第一次使用背景音频组件(即 MediaSessionMediabroswerMediaController),我有点困惑。

用户可以通过 Fragment 和通知来控制播放器。但是,虽然从 Fragment 我可以播放和停止媒体播放器,但在通知中只有播放按钮在工作,而暂停按钮似乎没有效果。老实说,我不明白为什么...

这是我用来根据媒体播放器的当前状态添加通知操作的代码

androidx.media.app.NotificationCompat.MediaStyle mediaStyle = new androidx.media.app.NotificationCompat.MediaStyle();

if(play){
    builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_pause,"Pause",MediaButtonReceiver.buildMediaButtonPendingIntent(
                      service,PlaybackStateCompat.ACTION_PLAY_PAUSE)));

    builder.setStyle(mediaStyle.setShowActionsInCompactView(0)
                     .setMediaSession(mediaSession.getSessionToken()));

    service.startForeground(2,builder.build());

}else{
    builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_play,"Play",PlaybackStateCompat.ACTION_PLAY)));

    builder.setStyle(mediaStyle.setShowActionsInCompactView(0)
                     .setMediaSession(mediaSession.getSessionToken()));

    notificationmanagerCompat notificationmanager = notificationmanagerCompat.from(service);
    notificationmanager.notify(2,builder.build());


    service.stopForeground(false);
}

这是我的MediaSessionCompat.Callback的一部分:

@Override
public void onPlay() {
    super.onPlay();

    if(isAudioFocusHold()) {
        mediaSession.setActive(true);
        setmediaplaybackState(PlaybackStateCompat.STATE_PLAYING);
        if(preparedplayer && mediaPlayer != null){
            Notifications.createPlayerNotification(service,mediaSession,true);
            if(!mediaPlayer.isPlaying()) mediaPlayer.start();
            updateCurrentPosition();
        }
    }
}

@Override
public void onPause() {
    super.onPause();

    if(mediaPlayer.isPlaying()){
        Notifications.createPlayerNotification(service,false);
        mediaPlayer.pause();
        stopPlaybackStateUpdate();
        setmediaplaybackState(PlaybackStateCompat.STATE_PAUSED);
    }
}

这是 setmediaplaybackState() 方法

public void setmediaplaybackState(int state) {
    PlaybackStateCompat.Builder playbackStateBuilder = new PlaybackStateCompat.Builder();
    playbackStateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE |
                PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY |
                PlaybackStateCompat.ACTION_STOP);
    
    playbackStateBuilder.setState(state,PlaybackStateCompat.PLAYBACK_POSITION_UNKNowN,0);
    mediaSession.setPlaybackState(playbackStateBuilder.build());
}

这就是我从 Fragment 控制播放的方式:

private void switchMediaController(){
    if(mCurrentState == null || mCurrentState == STATE_PAUSED) {
        MediaControllerCompat.getMediaController(activity).getTransportControls().play();
        mCurrentState = STATE_PLAYING;

    }else{
        if(MediaControllerCompat.getMediaController(activity).getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING) {
            MediaControllerCompat.getMediaController(activity).getTransportControls().pause();
        }
            mCurrentState = STATE_PAUSED;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)