在 MediaStyle 通知中禁用或隐藏搜索栏

Disable or hide seekbar in MediaStyle notifications

尝试构建一个实时流媒体播放应用程序,28 及以下 sdk 中的媒体样式通知在没有任何搜索栏的情况下看起来不错,但是当 运行 相同的应用程序在 Android 10(SDK 29)中时通知显示了我不想要的额外搜索栏,因为流是实时的并且我正在使用默认的 exoplayer(exo vers.2.10.8)行为来缓存。

如何禁用或隐藏搜索栏?

尝试在通知生成器中进行以下设置:

.setProgress(0,0,true)

以下通知片段:

    Notification notification = new Notification.Builder(this,Constant.CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_logo)
            .setContentTitle(title)
            .setContentText(message)
            .setLargeIcon(artwork)
            .addAction(new Notification.Action.Builder(
                    Icon.createWithResource(getApplicationContext(),playPauseResourceId),
                    "Play/Pause",
                    playPausePendingIntent).build())
            .addAction(new Notification.Action.Builder(
                    Icon.createWithResource(getApplicationContext(),R.drawable.exo_icon_stop),
                    "Play/Pause",
                    stopPendingIntent).build())
            .setStyle(new Notification.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken()))
            .setSubText(subText)
            .setContentIntent(pendingActivityIntent)
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .setProgress(0,0,true)
            .build();

截图:

您需要使用 PlayerNotificationManager 而不是 Notification.Builder,并使用带有 MediaMetadataCompat.METADATA_KEY_DURATION 键的 setExtras() 方法将自定义 Bundle extra 传递给 MediaDescriptionCompat.Builder-1 值然后覆盖 TimelineQueueNavigator class 的 getMediaDescription() 方法并将其传递给 MediaSessionConnector 像这样:

mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
    @Override
    public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
        Bundle extras = new Bundle();
        extras.putInt(MediaMetadataCompat.METADATA_KEY_DURATION, -1);

        return new MediaDescriptionCompat.Builder()
                .setMediaId(trackModel.mediaId)
                .setIconBitmap(trackModel.bitmap)
                .setTitle(trackModel.title)
                .setDescription(trackModel.description)
                .setExtras(extras)
                .build();
    }
});

除了 Squti 提供的解决方案之外的另一种方式。

只是不要在媒体样式通知中设置 MediaSession 令牌。因此,根据我在查询中发布的上述代码段,通知将定义如下:

Notification notification = new Notification.Builder(this,Constant.CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_logo)
            .setContentTitle(title)
            .setContentText(message)
            .setLargeIcon(artwork)
            .addAction(new Notification.Action.Builder(
                    Icon.createWithResource(getApplicationContext(),playPauseResourceId),
                    "Play/Pause",
                    playPausePendingIntent).build())
            .addAction(new Notification.Action.Builder(
                    Icon.createWithResource(getApplicationContext(),R.drawable.exo_icon_stop),
                    "Play/Pause",
                    stopPendingIntent).build())
            .setStyle(new Notification.MediaStyle().setShowActionsInCompactView(0))
            .setSubText(subText)
            .setContentIntent(pendingActivityIntent)
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .build();

只需从下面删除 .setMediaSession(mediaSession.getSessionToken()) :

.setStyle(new Notification.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken()))

不使用令牌或将令牌分配给通知将意味着您将无法拥有控制媒体服务所需的控件,而且您还失去了自动设置颜色(从专辑封面自动检测色温)等功能通知并且需要编写自定义缩进来控制播放器。

我也遇到了这个问题,不过我用的是NotificationCompat而不是exoplayer。
我按照 Squti 的回答找到了隐藏 NotificationCompat 搜索栏的解决方案。

val mediaSession = MediaSessionCompat(context, "your tag")

//These two lines work
val mediaMetadata = MediaMetadata.Builder().putLong(MediaMetadata.METADATA_KEY_DURATION, -1L).build()
mediaSession.setMetadata(MediaMetadataCompat.fromMediaMetadata(mediaMetadata))

val token = mediaSession.sessionToken

val mBuilder = NotificationCompat.Builder(context, channelId)
    .setStyle(androidx.media.app.NotificationCompat.MediaStyle()
            .setMediaSession(token))

尝试删除

    .setMediaSessionToken(mediaSession.getSessionToken());

事实上,让您在通知时显示搜索栏。