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

Man*_*ore 6 android android-notifications android-mediaplayer

尝试构建实时流媒体播放应用程序时,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();
Run Code Online (Sandbox Code Playgroud)

截图:

在此处输入图片说明

小智 7

我也遇到了这个问题,但我使用的是 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))
Run Code Online (Sandbox Code Playgroud)


Man*_*ore 5

除了 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();
Run Code Online (Sandbox Code Playgroud)

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

.setStyle(newNotification.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken()))

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


Squ*_*uti 3

您需要使用PlayerNotificationManager而不是使用自定义额外内容Notification.Builder并将其传递给带有键和值的using方法 ,然后重写类的方法并将其传递给如下所示:BundleMediaDescriptionCompat.BuildersetExtras()MediaMetadataCompat.METADATA_KEY_DURATION-1getMediaDescription()TimelineQueueNavigatorMediaSessionConnector

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();
    }
});
Run Code Online (Sandbox Code Playgroud)