Android 13 播放状态回调未调用(从通知按钮)

问题描述 投票:0回答:0

对于媒体播放器,

ACTION_SKIP_TO_NEXT
ACTION_SKIP_TO_PREVIOUS
都可以通过 android 12 及以下版本的通知按钮正常工作。 根据this.

,android 13 似乎有不同的行为

需要说明的是,图片中下方的按钮仅在 android 13 中不起作用。

Android 开发者提到 playbackstate 应该用于 android 13

“对于面向 Android 13(API 级别 33)及更高版本的应用,系统 从 PlaybackState 操作派生媒体控件。”

问题是,在 android 13 中,playstechange 从未被调用过,甚至

public int onStartCommand
也从未被调用过。

试过下面的代码但还是没用

        ComponentName receiver = new ComponentName(this, MediaButtonReceiver.class);
    mediaSession = new MediaSessionCompat(getApplicationContext(), "MediaSession", receiver, null);
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
            MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
            .setState(PlaybackStateCompat.STATE_PAUSED, 0, 0)
            .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)
            .setActions(PlaybackStateCompat.ACTION_SKIP_TO_NEXT)                .setActions(PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
            .build());

    mediaSession.setActive(true);

 mediaSession.setCallback(new MediaSessionCompat.Callback() {
        // Implement callbacks

        @Override
        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
            final String intentAction = mediaButtonEvent.getAction();

            if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
                final KeyEvent event = mediaButtonEvent.getParcelableExtra(
                        Intent.EXTRA_KEY_EVENT);
                if (event == null) {
                    return super.onMediaButtonEvent(mediaButtonEvent);
                }
                final int keycode = event.getKeyCode();
                final int action = event.getAction();
                if (event.getRepeatCount() == 0 && action == KeyEvent.ACTION_DOWN) {
                    switch (keycode) {
                        case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
                            if (mediaPlayer != null) {
                                if (isPlaying()) {
                                    playbackAction(1);                                        
                                    pauseMedia();                                        
                                    updateMetaData();
                                } else { // want to continue playing
                                    playbackAction(0);
                                    playMedia();
                                }
                            }                              
                            break;
                        case KeyEvent.KEYCODE_MEDIA_PAUSE:
                            pauseMedia();
                            break;
                        case KeyEvent.KEYCODE_MEDIA_PLAY:

                            process_play_request();
                            break;
                        case KeyEvent.KEYCODE_MEDIA_NEXT:
                            skipToPrevious();
                            break;
                        case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
                            skipToNext();
                            break;
                    }
                }
            }
            return super.onMediaButtonEvent(mediaButtonEvent);
        }});
    

并尝试添加此代码,但也没有用:

         MediaControllerCompat mController;

    mController = new MediaControllerCompat(this, mediaSession.getSessionToken());


    mController.registerCallback(mCallback);
    mCallback.onPlaybackStateChanged(mController.getPlaybackState());
    mCallback.onMetadataChanged(mController.getMetadata());

private final MediaControllerCompat.Callback mCallback = new MediaControllerCompat.Callback() {
    @Override
    public void onPlaybackStateChanged(PlaybackStateCompat playbackState) {
        onUpdate();
    }

    @Override
    public void onMetadataChanged(MediaMetadataCompat metadata) {
        onUpdate();
    }

    @Override
    public void onSessionDestroyed() {
    }

    private void onUpdate() {
    }
};

此问题与

android.permission.POST_NOTIFICATIONS
无关,因为请求并授予了运行时权限,但仍然没有用。

请多多建议

android notifications android-mediaplayer mediaplayback
© www.soinside.com 2019 - 2024. All rights reserved.