Android 通知 MediaStyle 忽略正在进行的标志

bug*_*ily 10 android android-notifications kotlin androidx android-notification.mediastyle

我正在尝试在音频 Android 应用程序中使用 MediaStyle 通知,如音频应用程序文档媒体样式文档中所述。我能够成功地显示具有功能传输控制的通知,因此我相信我的实施是合理的。但是,当我按照建议设置androidx.media.app.NotificationCompat.MediaStylevia时,它似乎忽略了该标志的任何使用。根据源代码确保“通知不能被忽略”。当没有设置媒体样式时,我会遇到所描述的行为,但当我使用..setStyle()NotificationCompat.Builder.setOngoing()setOngoing.setStyle()

我想知道是否有人知道解决方法,或者是否有一些未记录的要求,我需要安抚以使用.setOngoing()媒体样式通知。我的编译 SDK 版本、目标 SDK 版本和最小 SDK 版本都是 30。如果有任何其他代码有用,请告诉我;我相信我正在提供相关的内容。

为了说明这种困境,我提供了一些屏幕截图,显示了应用媒体样式时通知如何可消除,而未应用媒体样式时通知如何不可消除。

媒体风格: 具有媒体风格

无媒体风格: 无媒体风格

依赖项(全部是最新的):

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

bug*_*ily 6

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

没有媒体风格(不可忽略): 没有媒体风格(不可忽略)

使用媒体样式并且不设置媒体会话(不可关闭): 具有媒体样式且不设置媒体会话(不可关闭)

使用媒体样式并设置媒体会话(可关闭): 具有媒体风格并设置媒体会话(可关闭)

使用媒体样式并将媒体会话设置为关闭: 具有媒体风格并将媒体会话设置为关闭