【问题标题】:Android Notification MediaStyle Ignores Ongoing FlagAndroid 通知 MediaStyle 忽略正在进行的标志
【发布时间】:2021-06-07 05:49:23
【问题描述】:

我正在尝试在音频 Android 应用程序中使用 MediaStyle 通知,如 audio app documentationmedia style documentation 中所述。我能够成功地显示带有功能传输控件的通知,所以我相信我的实现是合理的。但是,当我按照建议通过NotificationCompat.Builder.setStyle() 设置androidx.media.app.NotificationCompat.MediaStyle 时,它似乎忽略了.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")
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()
        }

【问题讨论】:

  • 您找到解决此问题的方法了吗?我也面临同样的问题

标签: android kotlin android-notifications androidx android-notification.mediastyle


【解决方案1】:

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

没有媒体风格(不可关闭):

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

使用媒体样式和设置媒体会话(可关闭):

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。在将 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

    下面是我的完整媒体会话。确保为您的音频设置正确的参数值,例如持续时间等。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多