对于媒体播放器,
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
无关,因为请求并授予了运行时权限,但仍然没有用。
请多多建议