安卓通知栏MediaStyle忽略持续标记

10
我正在尝试在一个音频Android应用程序中使用音频应用文档以及媒体样式文档中讨论的MediaStyle通知。我能够成功显示带有功能传输控件的通知,因此我认为我的实现是正确的。但是,当我通过 NotificationCompat.Builder .setStyle()设置androidx.media.app.NotificationCompat.MediaStyle时,似乎会忽略任何对.setOngoing()标志的使用。setOngoing根据源代码确保“通知无法被解除”。在未设置媒体样式时,我遇到了所描述的行为,但在使用.setStyle()时没有这种情况。
我想知道是否有人知道解决方法,或者是否存在某些未记录的要求需要满足才能将.setOngoing()与媒体样式通知一起使用。我的编译SDK版本、目标SDK版本和最小SDK版本都是30。如果需要其他代码,请告诉我;我认为我提供了相关的内容。
为了说明这个困境,我包括了屏幕截图,显示了当应用媒体样式时通知如何被解除,当不应用媒体样式时通知无法被解除。
带Media Style: with media style 不带Media Style: without media style 依赖(全部更新):
val appCompatVersion: String = "1.4.0-alpha01"
val mediaVersion: String = "1.4.0-alpha01"
val media2Version: String = "1.0.0-alpha04"

implementation("androidx.appcompat:appcompat:$appCompatVersion")
implementation("androidx.media:media:$mediaVersion")
implementation("androidx.media2:media2:$media2Version")

private val notification: Notification?
        get() {
            val controller: MediaControllerCompat = mediaSession.controller ?: return null
            val description: MediaDescriptionCompat = controller.metadata?.description ?: return null
            val notificationManager: NotificationManager = notificationManager ?: return null

            val notificationChannel = NotificationChannel(
                CHANNEL_ID,
                CHANNEL_NAME,
                NotificationManager.IMPORTANCE_NONE
            )

            if (notificationChannel !in notificationManager.notificationChannels) {
                notificationManager.createNotificationChannel(notificationChannel)
            }

            ...

            val style = androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(controller.sessionToken)
                .setShowActionsInCompactView(0, 1, 2)
                .setShowCancelButton(false)

            return NotificationCompat.Builder(
                this,
                CHANNEL_ID
            ).apply {
                actions.forEach { addAction(it) }
                color = backgroundColor
            }
                .setContentTitle(description.title)
                .setContentText(description.subtitle)

                .setSmallIcon(smallIcon)
                .setLargeIcon(largeIcon)

                .setOngoing(true)
                .setColorized(true)
                .setAutoCancel(false)
                .setAllowSystemGeneratedContextualActions(true)

                .setContentIntent(controller.sessionActivity)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)

                .setChannelId(CHANNEL_ID)
                .setStyle(style)
                .build()
        }

3
你解决了这个问题吗?我也遇到了同样的问题。 - Rene
2个回答

6
Android通知确实有些神秘,我不太确定为什么我的应用程序与其他使用相同方法的应用程序(Music Player GO, UAMP)行为不同。我猜测差异是由于包版本或导入引起的,因为即使尝试导入MediaStyle也会遇到很多问题,考虑到媒体库从未完全移植到androidx。我发现,虽然媒体样式通知最初可以通过滑动来解除,但它仍然作为扩展通知存在于扩展菜单中。我对此感到满意,因为通知在某个地方是可访问的。但是,我希望用户可以切换其在通知窗格中的位置,因为滑动似乎是将其隔离到扩展通知窗格的任意操作。我还发现,这种行为仅出现在androidx.media.app.NotificationCompat.MediaStyle.setMediaSession()方法中。如果我不设置媒体样式的媒体会话,则会得到传统持续通知样式和现代媒体通知样式的混合体。我将提供我尝试调试时遇到的不同通知样式的矩阵。

没有媒体样式(不可关闭): 没有媒体样式(不可关闭)

有媒体样式但没有设置媒体会话(不可关闭): 有媒体样式但没有设置媒体会话(不可关闭)

有媒体样式并设置了媒体会话(可关闭): 有媒体样式并设置了媒体会话(可关闭)

有媒体样式并在关闭时设置了媒体会话: 有媒体样式并在关闭时设置了媒体会话


4

我曾面临同样的问题。在将setPlaybackState设置为mediasession后,问题对我来说得到了解决。

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f)
        .build()
)

请查阅以下链接,获取正确的 setState 参数:https://developer.android.com/reference/kotlin/android/support/v4/media/session/PlaybackStateCompat.Builder 我的完整mediasession如下。请确保为您的音频设置正确的参数值,例如持续时间等等。
private fun createMediaSession(): MediaSessionCompat {
    val mediaSession = MediaSessionCompat(this, "tag")

    mediaSession.setMetadata(MediaMetadataCompat.Builder()
        .putLong(MediaMetadata.METADATA_KEY_DURATION, -1L)
        .build())

    mediaSession.setRepeatMode(PlaybackStateCompat.REPEAT_MODE_ONE)
    mediaSession.setFlags(0)

    mediaSession.setPlaybackState(
        PlaybackStateCompat.Builder()
            .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f)
            .build()
    )

    return mediaSession
}

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