在MediaStyle通知中禁用或隐藏进度条

10

尝试构建一个直播流媒体播放应用,在28及以下SDK中的媒体样式通知看起来不错,没有任何进度条,但当在Android 10(SDK 29)中运行相同的应用程序时,通知会显示额外的进度条,而我不想要这个因为流是实时的,我正在使用默认的exo player(版本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
@Squti 版本 2.10.8 - MDT
4个回答

9
我也遇到了这个问题,但我使用的是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
@isabsent 你的意思是使用SeekBar来控制音乐/声音的进度吗? - GreatC
是的 - 控制音乐/声音的进度。 - isabsent
我已经搜索了API好几天,但仍然找不到解决方案或代码示例。如果您找到了解决方案,请告诉我如何操作。 - GreatC
我已经通过使用mediaSession.setCallback()找到了解决方案。代码示例 https://github.com/kabouzeid/Phonograph MusicService:251 和 MutilPlayer:255 - GreatC
显示剩余2条评论

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

只需从以下代码中删除.setMediaSession(mediaSession.getSessionToken()):

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

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


3

您需要使用PlayerNotificationManager而不是Notification.Builder,并使用setExtras()方法向MediaDescriptionCompat.Builder传递自定义Bundle extra,使用MediaMetadataCompat.METADATA_KEY_DURATION键和-1值,然后覆盖TimelineQueueNavigator类的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();
    }
});

1
我正在使用Notification.Builder构建通知,而不是MediaDescriptionCompat。尝试将额外的内容放入notif builder中,但没有任何变化,seeker仍然出现。 - MDT
你需要在ExoPlayer中使用PlayerNotificationManager类 @Manti_Core - Squti
走这条路将会更加费力重构,我已经在我的代码中写了很多关于通知自定义的内容。对于媒体样式的通知也应该有某种解决方法。 - MDT
PlayerNotificationManager需要MessionSessionCompat,但我正在使用MediaSession。 - MDT
1
这个链接是使用PlayerNotificationManager和TimelineQueueNavigator通过ExoPlayer完整实现音乐播放器的代码 https://github.com/google/ExoPlayer/tree/io18/audio-app - Squti
显示剩余3条评论

1
尝试删除
    .setMediaSessionToken(mediaSession.getSessionToken());

事实上,这让您可以在通知中显示进度条。

1
谢谢您的回答,但是这种方法已经在下面被建议过了。 - MDT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接