我们可以通过使用 MediaSessionCompat 和 MediaStyle 来替代 API 33 的媒体通知功能,并实现自定义的控制器布局。
示例代码:
首先,在 Activity 或 Service 中创建一个 MediaSessionCompat 对象:
MediaSessionCompat mMediaSession = new MediaSessionCompat(context, "tag");
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
然后,设置 MediaSessionCompat 的回调函数:
mMediaSession.setCallback(new MediaSessionCompat.Callback() {
@Override
public void onPlay() {
super.onPlay();
// 处理播放事件
}
@Override
public void onPause() {
super.onPause();
// 处理暂停事件
}
@Override
public void onStop() {
super.onStop();
// 处理停止事件
}
@Override
public void onSkipToNext() {
super.onSkipToNext();
// 处理播放下一首事件
}
@Override
public void onSkipToPrevious() {
super.onSkipToPrevious();
// 处理播放上一首事件
}
@Override
public void onSeekTo(long pos) {
super.onSeekTo(pos);
// 处理进度改变事件
}
});
接着,在代码中创建 MediaStyle 对象,并设置 MediaSessionCompat 的 Token:
MediaStyle style = new MediaStyle();
style.setMediaSession(mMediaSession.getSessionToken());
style.setShowActionsInCompactView(0, 1, 2); // 设置在通知界面显示哪些控制按钮
// 创建 Notification 并设置相关参数
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setContentTitle("Title")
.setContentText("Artist")
.setSmallIcon(R.drawable.icon)
.setStyle(style)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(0, builder.build());
最后,在 onDestroy