【问题标题】:Disable or hide seekbar in MediaStyle notifications在 MediaStyle 通知中禁用或隐藏搜索栏
【发布时间】:2019-12-22 09:44:52
【问题描述】:

尝试构建一个实时流媒体播放应用程序,28 及以下 sdk 中的媒体样式通知在没有任何搜索栏的情况下看起来不错,但在 Android 10 (SDK 29) 中运行相同的应用程序时,通知显示额外的搜索栏,我没有'不想要,因为流是实时的,并且我使用默认的 exoplayer(exo 版本 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();

截图:

【问题讨论】:

  • 你用的是哪个版本的 ExoPlayer?
  • @Squti 版本 2.10.8

标签: android android-mediaplayer android-notifications


【解决方案1】:

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

【讨论】:

  • 谢谢!您是否有代码示例如何在没有ExoPlayer 特定类(如PlayerNotificationManager)的情况下在通知中获取SeekBar
  • @isabsent 你的意思是用 SeekBar 来控制音乐/声音的进度吗?
  • 是 - 控制音乐/声音的进度。
  • 我已经搜索 API 好几天了,但仍然找不到解决方案或代码示例。 ?如果你找到了解决办法,请告诉我如何。
  • @GreatC 找到解决方案了吗?我和你们在同一个队列中。
【解决方案2】:

您需要使用PlayerNotificationManager 而不是Notification.Builder 并使用setExtras() 方法将自定义Bundle 额外传递给setExtras() 键和-1 值,然后覆盖@987654330 的getMediaDescription() 方法@class 并将其传递给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();
    }
});

【讨论】:

  • 我正在使用 Notification.Builder 构建通知而不是 MediaDescriptionCompat,尝试将附加内容放入 notif builder 中,根本没有更改,搜索器仍然出现。
  • 你需要在 ExoPlayer @Manti_Core 中使用 PlayerNotificationManager 类
  • 这样做会花费我更多的重组成本,我已经为自定义代码中的通知编写了很多内容。媒体样式通知也应该有一些解决方法。
  • PlayerNotificationManager 需要 MessionSessionCompat,但我正在使用 MediaSession
  • 此链接是 ExoPlayer 使用 PlayerNotificationManager 和 TimelineQueueNavigator github.com/google/ExoPlayer/tree/io18/audio-app完整实现的音乐播放器
【解决方案3】:

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

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

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()))

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

【讨论】:

    【解决方案4】:

    尝试删除

        .setMediaSessionToken(mediaSession.getSessionToken());
    

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

    【讨论】:

    • 感谢您的回答,但下面已经建议了这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多