微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。